1

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

4

2 回答 2

3

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 回答
3

最初的 sigil 语法是用于 sigil 的字符在def __s__哪里s(现在应该是def sigil_s.)。您可以在开始处理 sigil 的初始提交中看到这一点。我相信这项工作是在宏实施之前开始的。

这种语法需要一个 hack 来允许它们被导入,你可以在这个 issue 中阅读。

今天,当有人写 %f"foo" 时,它会转换为f ("foo", [])。这个提议是把翻译改成:sigil_f("foo", [])。

这种变化带来了两个好处:

1)名称更明确;
2)它允许我们删除我们进口商的黑客。今天 import Hello 带来了 Hello 中所有不以下划线开头但对 sigils 例外的函数;

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

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

我不确定为什么它不是defsigil也许没有人建议它?这是我最好的猜测,因为在这篇文章的时候,在谷歌上搜索“defsigil”只会返回这个问题。如果在 GitHub 或 IRC 上提到它,那么搜索结果中就会提到它。

于 2015-06-01T15:07:12.950 回答