在Erlang shell中,如何自动读取所有记录定义标题

时间:2010-11-01 18:15:56

标签: erlang erlang-shell

这开始是一个问题:

几乎每次我使用Erlang shell时,我都想在shell启动时运行一些命令,例如

之类的东西
rr("*.hrl").

或类似的。目前我每次启动一个Erlang shell时都要输入它,我已经厌倦了它并且一直忘记它。

这实际上是错误的问题!我真正想要做的是在每个shell作业中读取我的记录定义标题。不能用于启动时运行的其他shell内置命令。所以我改变了问题标题,以显示它应该如何询问的问题。

3 个答案:

答案 0 :(得分:14)

在尝试使用.erlang的解决方案时,我偶然发现了针对特定rr / 1用法的解决方案:

从shell的手册页:

  

支持在shell中读取和打印记录。         在编译期间,记录表达式被转换为元组表达式 -         sions。在运行时,不知道元组是否实际代表a         记录。编译器使用的记录定义也不可用于         运行。所以为了读取记录语法和打印元组为         记录在可能的情况下,记录定义必须由         壳本身。 shell命令用于读取,定义,遗忘,         列表和打印记录如下所述。注意每个工作         有自己的一组记录定义。方便记录事宜         模块shell_default和user_default中的定义(如果已加载)         每次启动新作业时都会读取。例如,添加行

  -include_lib("kernel/include/file.hrl").
     

到user_default使得file_info的定义随时可用   贝壳。

为了澄清,我添加了一些例子:

档案foo.hrl

-record(foo, {bar, baz=5}).

档案:user_default.erl

-module(user_default).
-compile(export_all).

-include("foo.hrl").  % include all relevant record definition headers here

 %% more stuff probably ...

让我们试试shell:

$ erl
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.5  (abort with ^G)
1> #foo{}.
#foo{bar = undefined,baz = 5}

→shell知道来自foo.hrl的记录

答案 1 :(得分:2)

在shell启动时评估文件.erlang,但在shell的上下文中对 NOT 进行评估。这意味着它只能包含已评估的通用表达式而不包含shell命令。不幸的是rr()是一个shell命令(它初始化本地shell数据以识别记录),所以它不能在.erlang文件中使用。

虽然必须预加载的用户定义模块user_default可以包含使用-include-include_lib包含记录定义的文件,但这些记录定义只能用于定义的函数在user_default内。 user_default是普通的编译模块,其中的导出函数被称为任何其他函数,因此记录定义在shell中不可见。 user_default允许用户定义更复杂的函数,这些函数可以在shell中作为shell命令调用。

编辑:

我在这里部分错了。虽然我对如何评估.erlang以及如何调用user_default中的函数是正确的,但我错过了在shell启动时如何扫描user_default.erl以获取在shell中可用的记录定义。感谢@Peer Stritzinger指出这一点。

答案 2 :(得分:0)

将其放在主目录中名为.erlang的文件中(参见http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html中的第1.7.1段)。