为啥常见的 Erlang 应用程序(Common Test、Dialyzer、leex、yecc 等)在 `erl` shell 中不可用?

Posted

技术标签:

【中文标题】为啥常见的 Erlang 应用程序(Common Test、Dialyzer、leex、yecc 等)在 `erl` shell 中不可用?【英文标题】:Why are common Erlang application (Common Test, Dialyzer, leex, yecc etc.) not available in the `erl` shell?为什么常见的 Erlang 应用程序(Common Test、Dialyzer、leex、yecc 等)在 `erl` shell 中不可用? 【发布时间】:2019-04-14 20:19:25 【问题描述】:

回到 Erlang,我注意到我无法运行任何有自己的用户指南的支持框架,例如 EUnit、Common Test、leex、yecc、Dyalizer、Typer 等。

根据Common Test User's Guide,“Common Test 应用程序与 Erlang/OTP 系统一起安装”并且“不需要额外的安装步骤”。我认为这对其他人也是如此,而且我确信我缺少一些基本的东西。

【问题讨论】:

所有这些工具都有一些合适的Erlang“入口点”函数,调用这个函数应该可以工作(假设你没有在嵌入模式下启动你的节点/shell)。这可能是由 shell 的自动完成功能引起的误解,该功能基于已加载的内容? 非常感谢!我尝试明确输入函数,但我想我不是一个好的打字员......我也更新了我的答案,但从技术上讲这是你的答案,所以如果你提交自己的,那么我会接受它;不想因此而受到赞扬。 【参考方案1】:

@aronisstav 对“基于已加载内容的 shell 自动完成功能引起的误解的评论一针见血。再次引用他的话,正确答案是:

所有这些工具都有一些合适的 Erlang“入口点”功能和 调用这个函数应该可以工作(假设你没有开始你的 嵌入模式下的节点/shell)。

在下面尝试一下,它们奏效了(我想我只是个白痴):

6> leex:file("./program.erl").
./program.erl.xrl: no such file or directory
error
7> dialyzer:gui().

要让 shell 自动完成工作,只需在 erl shell 中使用 code:load_file/1l(Module) 加载模块:

$ erl

1> code:load_file(ct).
module,ct

2> l(dialyzer).
module,dialyzer

【讨论】:

模块未“预加载”这一事实并不会使它们“不可用”。您实际上并不需要显式加载它们;只要它们在加载路径中,调用其中的任何函数都会自动加载它们(假设您没有以嵌入式模式启动节点/shell)。所有这些工具都有一些合适的 Erlang “入口点”,可以在没有显式 l(...) 的情况下使用。

以上是关于为啥常见的 Erlang 应用程序(Common Test、Dialyzer、leex、yecc 等)在 `erl` shell 中不可用?的主要内容,如果未能解决你的问题,请参考以下文章

Erlang 在哪里使用,为啥? [关闭]

为啥我的 Erlang 应用程序崩溃了?

为啥代码版本控制器在 erlang 中不起作用?

为啥这个带有类型签名的 erlang prog 可以编译?

为啥 Erlang 中的模式匹配记录会抛出错误

为啥套接字关闭 Erlang