【问题标题】:Why are basic functions in Elixir (i.e. length/1) under the default Kernel module?为什么 Elixir 中的基本函数(即 length/1)在默认 Kernel 模块下?
【发布时间】:2019-06-01 16:26:23
【问题描述】:

Elixir 中的 Kernel 模块提供了很多功能,默认情况下可以在任何地方导入,而不需要前缀 Kernel。但是,其中许多函数只作用于特定的数据类型。

对我来说最突出的是对列表进行操作的那些,例如 length/1hd/1tl/1。 Elixir 已经有一个List module,那么为什么这些函数没有包含在 List 模块中(即List.length/1)?

我了解常用功能更短、更方便,但这样就不会使用别名在List 之类的模块中复制功能吗?鉴于这些函数是作为宏实现并由编译器内联的,是否存在语言约定或技术限制会使这变得困难?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    我肯定不够熟悉,无法给出任何好的答案。

    但我猜主要原因是为了让事情变得更容易,尤其是对于初学者。 Kernel 模块基本上只包含像 :erlang.length(list) 这样委托给 erlang BIF 的函数,其余的主要是重要的语言构造宏,如 (defmacrodefmodule) 和一些方便的宏,如 (andunless。将内核模块加载为默认环境实际上是有意义的。

    为什么长度在Kernal而不是List,我想这主要是因为遵循erlang约定,其中length之类的函数作为BIF放在erlang模块中。

    【讨论】:

    • 这很好,我没想过要与 Erlang 文档进行比较。看起来 Erlang 中的长度也在默认命名空间而不是 List 模块中(erlang.org/doc/man/lists.html)。
    【解决方案2】:

    Elixir Kernel 主要由基本的语言原语、宏和用于模式匹配的守卫组成。 Elixir 编译器将内核模块中的 length/1、hd/1 和 tl/1 等函数内联到 :erlang 模块中的 Erlang 对应函数中。一些函数,如 length/1 可用于守卫,而其他函数用于编译器优化。

    这些基本功能为 Elixir 标准库提供了构建在其之上的基本功能。例如,List.zip/1 使用 is_list/1 守卫进行模式匹配。

    Elixir 核心团队没有在 List 模块中包含这些函数和运算符的原因之一是 Elixir doesn't alias functions for discoverability.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 2019-05-11
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多