Почему синтаксис для определения сигил в 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
Другие вопросы по тегам