Elixir中的内核模块提供了许多功能,默认情况下,无需前缀hd/1
即可将其导入任何地方。但是,其中许多功能仅作用于特定的数据类型。
对我而言突出的是那些在列表上进行操作的对象,例如length/1
,tl/1
和List.length/1
。 Elixir已经有了一个List
module,那么为什么这些功能未包含在“列表”模块(即List
)中?
对于常用功能,我知道它更短,更方便,但是会不会使用别名在类似password
的模块中复制该功能?考虑到这些功能是作为宏实现并由编译器内联的,是否存在语言约定或技术限制会使其变得困难??
答案 0 :(得分:1)
我绝对不熟悉,无法给出任何好的答案。
但是我的猜测将是使事情变得容易的主要原因,尤其是对于初学者而言。 Kernel
模块基本上只包含委托给erlang BIF的函数,例如:erlang.length(list)
,其余大部分是重要的语言构造宏,例如(defmacro
,defmodule
)和一些方便的函数,例如( and
,unless
。实际上,将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.