1

Elixirチュートリアルのシジルに関するページを読んでいました。
シジルを定義するための構文は、「defstruct」、「defprotocol」などと同じように「defsigil」を使用すると予想していました。
しかし、そうではありませんでした。
なんで?

4

2 に答える 2

3

元のシジルの構文は、シジルに使用される文字はdef __s__whereでした (これは今では .)シジルの作業を開始した最初のコミットでこれを見ることができます。この作業は、マクロが実装される前に始まったと思います。sdef 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 で言及されていれば、検索結果に言及されていたはずです。

于 2015-06-01T15:07:12.950 に答える
3

シジルは、特定のメソッドを呼び出すための凝った方法です。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
于 2015-06-01T10:25:18.937 に答える