为什么默认内核模块下的Elixir(即length / 1)具有基本功能?

时间:2019-01-06 23:58:50

标签: elixir

Elixir中的内核模块提供了许多功能,默认情况下,无需前缀hd/1即可将其导入任何地方。但是,其中许多功能仅作用于特定的数据类型。

对我而言突出的是那些在列表上进行操作的对象,例如length/1tl/1List.length/1。 Elixir已经有了一个List module,那么为什么这些功能未包含在“列表”模块(即List)中?

对于常用功能,我知道它更短,更方便,但是会不会使用别名在类似password的模块中复制该功能?考虑到这些功能是作为宏实现并由编译器内联的,是否存在语言约定或技术限制会使其变得困难??

2 个答案:

答案 0 :(得分:1)

我绝对不熟悉,无法给出任何好的答案。

但是我的猜测将是使事情变得容易的主要原因,尤其是对于初学者而言。 Kernel模块基本上只包含委托给erlang BIF的函数,例如:erlang.length(list),其余大部分是重要的语言构造宏,例如(defmacrodefmodule)和一些方便的函数,例如( andunless。实际上,将Kernal模块作为默认环境加载是合理的。

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

答案 1 :(得分:0)

Elixir内核主要由基本语言原语,宏和用于模式匹配的防护组成。 Elixir编译器将那些函数(如Kernal模块中的length / 1,hd / 1和tl / 1)内联到它们在:erlang模块中的Erlang对应项中。一些功能(例如length / 1)可以用于防护中,而其他功能则用于编译器优化。

那些基本功能为Elixir标准库提供了基础功能。例如,List.zip / 1使用is_list / 1保护符来进行模式匹配。

Elixir核心团队未在“列表”模块中包含这些功能和运算符的原因之一是Elixir doesn't alias functions for discoverability.