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 № 1La 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