为什么在Elixir中定义sigils的语法不使用“defsigil”?

时间:2015-06-01 09:54:19

标签: elixir sigils

我正在阅读Elixir教程中关于sigils的page 我期望定义sigils的语法使用“defsigil”就像“defstruct”,“defprotocol”等等。
但事实并非如此 为什么?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

这种语法需要黑客才允许导入它们,您可以在this 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或许没有人建议过它?这是我最好的猜测,因为在这篇文章发表时,在Google上搜索“defsigil”只会返回这个问题。如果在GitHub或IRC上提到它,那么在搜索结果中就会提到它。