【问题标题】:Why the syntax for defining sigils in Elixir doesn't use "defsigil"?为什么 Elixir 中定义印记的语法不使用“defsigil”?
【发布时间】:2015-06-01 09:54:18
【问题描述】:

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

【问题讨论】:

  • 这个问题似乎比这里更适合向 Elixir 核心维护者提问。投票结束。

标签: elixir sigils


【解决方案1】:

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

此语法需要 hack 才能导入它们,您可以在 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 上提到它,那么搜索结果中就会提到它。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 我还认为defsigil 不存在是有“道德”原因的:印记会很快导致极其神秘的代码。 Elixir 提供了编写自定义印记的工具,但我认为只有在使用它们的好处很多时才应该使用它们。
    • 但是我想知道为什么不是defsigil u(string, _options) do string |> String.upcase end
    • 你必须直接问 Jose - 最好的地方可能是 freenode IRC 上的#elixir-lang。
    • @PawełObrok 谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多