Elixirチュートリアルのシジルに関するページを読んでいました。
シジルを定義するための構文は、「defstruct」、「defprotocol」などと同じように「defsigil」を使用すると予想していました。
しかし、そうではありませんでした。
なんで?
2 に答える
元のシジルの構文は、シジルに使用される文字はdef __s__
whereでした (これは今では .)シジルの作業を開始した最初のコミットでこれを見ることができます。この作業は、マクロが実装される前に始まったと思います。s
def sigil_s
この構文をインポートするにはハックが必要でした。これについては、この号で説明しています。
今日、誰かが %f"foo" と書くと、それはf ("foo", []) に変換されます。この提案は、翻訳を sigil_f("foo", []) に変更することです。
この変更により、次の 2 つの利点がもたらされます。
1) 名前がより明確です。
2) インポーターのハックを取り除くことができます。現在、 import Hello は、アンダースコアで始まらないすべての関数を Hello から取得しますが、シジルは例外です。
議論の中で、他のいくつかの提案が提案されたことがわかりますが、最終的にdefmodule Sigil.s
は構文が選択されました。def sigil_s
これらの変更を実装する実際のコミットはhttps://github.com/elixir-lang/elixir/commit/c6284557e792efd67f13f421b723a7a301bdbb93です。
defsigil
なぜ誰もそれを提案しなかったのか、私にはわかりません。この投稿の時点で、 Googleで「defsigil」を検索すると、この質問しか返されないことを考えると、これが私の推測です。GitHub または IRC で言及されていれば、検索結果に言及されていたはずです。
シジルは、特定のメソッドを呼び出すための凝った方法です。Custom Sigilsのセクションを見てください。基本的~x/things/options
には と同じsigil_x(things, options)
です。したがって、次のように書くことができます。
defmodule Thing do
def sigil_u(string, _options) do
string |> String.upcase
end
def test do
~u/bob/
end
end
IO.inspect Thing.test