/ / Perché la sintassi per la definizione dei sigilli in Elixir non utilizza "defsigil"? - elisir, sigilli

Perché la sintassi per la definizione dei sigilli in Elixir non utilizza "defsigil"? - elisir, sigilli

Stavo leggendo il pagina sui sigilli nel tutorial sull'elisir.
Mi aspettavo che la sintassi per la definizione dei sigilli usasse "defsigil" proprio come "defstruct", "defprotocol" e così via.
Ma non era così.
Perché?

risposte:

3 per risposta № 1

La sintassi del sigillo originale era def __s__ dove s è il carattere usato per il sigillo (questo sarebbe ora def sigil_s.) Puoi vedere questo nel commit iniziale che ha iniziato a lavorare sui sigilli. Credo che questo lavoro sia iniziato prima che le macro fossero implementate.

Questa sintassi ha richiesto un hack per consentire loro di essere importati in cui è possibile leggere questa edizione.

Oggi, quando qualcuno scrive% f "foo", si traduce in f("foo", []). Questa proposta è di cambiare la traduzione in: sigil_f ("foo", []).

Questo cambiamento comporta due vantaggi:

1) Il nome è più esplicito;
2) Ci permette di rimuovere un hack nel nostro importatore. Oggi, import Hello porta tutte le funzioni di Hello che non iniziano con underscore ma fa un'eccezione per sigils;

Puoi vedere nella discussione che alcuni altri suggerimenti come defmodule Sigil.s sono stati suggeriti, tuttavia il def sigil_s la sintassi è stata infine scelta.

Il commit effettivo che implementa questi cambiamenti è https://github.com/elixir-lang/elixir/commit/c6284557e792efd67f13f421b723a7a301bdbb93

Non sono sicuro del perché non lo sia defsigil forse nessuno lo ha suggerito? Questa è la mia ipotesi migliore dato che al momento di questo post, cercando "defsigil" su Google restituisce solo questa domanda. Se fosse menzionato su GitHub o IRC, ne sarebbe stato menzionato nei risultati di ricerca.


3 per risposta № 2

I sigilli sono solo un modo elegante per chiamare metodi specifici. Dai un'occhiata alla sezione su Sigilli personalizzati. Fondamentalmente ~x/things/options equivale a sigil_x(things, options). Quindi puoi scrivere qualcosa come:

defmodule Thing do
def sigil_u(string, _options) do
string |> String.upcase
end

def test do
~u/bob/
end
end

IO.inspect Thing.test