为什么在 Elixir 中定义印记的语法不使用 "defsigil"?

Why the syntax for defining sigils in Elixir doesn't use "defsigil"?

我正在阅读 Elixir 教程中关于印记的 page
我希望定义印记的语法使用 "defsigil" 就像 "defstruct"、"defprotocol" 等。
但事实并非如此。
为什么?

Sigils 只是一种调用特定方法的奇特方式。查看 Custom Sigils 部分。基本上 ~x/things/optionssigil_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

原始印记语法是 def __s__,其中 s 是印记使用的字符(现在是 def sigil_s。)您可以在 initial commit 开始研究印记。我相信这项工作在实施宏之前就开始了。

此语法需要 hack 才能导入它们,您可以在 this issue.

中阅读相关内容

Today, when someone writes %f"foo", it translates to f("foo", []). This proposal is to change the translation to: sigil_f("foo", []).

This change brings two benefits:

1) The name is more explicit;
2) It allows us to remove a hack in our importer. Today, import Hello brings all functions from Hello that do not start with underscore but it makes an exception for sigils;

您可以在讨论中看到提出了一些其他建议,例如 defmodule Sigil.s,但最终选择了 def sigil_s 语法。

实现这些更改的实际提交是 https://github.com/elixir-lang/elixir/commit/c6284557e792efd67f13f421b723a7a301bdbb93

我不确定为什么没有 defsigil 也许没有人建议?这是我最好的猜测,因为在 post 时,仅在 Google 上搜索 "defsigil" 这个问题。如果它在 GitHub 或 IRC 上被提及,那么搜索结果中就会提到它。