Почему синтаксис для определения сигил в Elixir не использует "defsigil"?
Я читал страницу о символах в учебнике по эликсиру.
Я ожидал, что синтаксис для определения сигил использует "defsigil" так же, как "defstruct", "defprotocol" и так далее.
Но это было не так.
Зачем?
2 ответа
Оригинальный синтаксис сигил был def __s__
где s
это символ, используемый для сигилы (теперь это будет def sigil_s
.) Вы можете увидеть это в начальном коммите, который начал работу с сигилами. Я считаю, что эта работа началась до того, как были реализованы макросы.
Этот синтаксис требовал взлома, чтобы разрешить их импорт, о котором вы можете прочитать в этом выпуске.
Сегодня, когда кто-то пишет%f"foo", это переводится как f("foo", []). Это предложение состоит в том, чтобы изменить перевод на: sigil_f("foo", []).
Это изменение приносит два преимущества:
1) имя более явное;
2) Это позволяет нам убрать взлом у нашего импортера. Сегодня импорт Hello возвращает все функции Hello, которые не начинаются с подчеркивания, но делают исключение для сигил;
Вы можете увидеть в обсуждении некоторые другие предложения, такие как defmodule Sigil.s
были предложены, однако def sigil_s
синтаксис был в конечном итоге выбран.
Фактическая фиксация, которая реализует эти изменения: https://github.com/elixir-lang/elixir/commit/c6284557e792efd67f13f421b723a7a301bdbb93
Я не уверен, почему это не так defsigil
возможно никто не предложил это? Это мое лучшее предположение, учитывая, что на момент написания этого поста поиск "defsigil" в Google возвращал только этот вопрос. Если бы это было упомянуто на GitHub или IRC, то было бы упоминание об этом в результатах поиска.
Сигилы - это просто причудливый способ вызова определенных методов. Взгляните на раздел " Пользовательские символы". В принципе ~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