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

Pee*_*ger 12 erlang erlang-shell

这开始是一个问题:

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

rr("*.hrl").
Run Code Online (Sandbox Code Playgroud)

或类似的.目前我必须在每次启动Erlang shell时键入它,我已经厌倦了它并且一直忘记它.

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

Pee*_*ger 15

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

从shell的man-page:

有一些支持在shell中读取和打印记录.在编译期间,记录表达式被转换为元组表达式.在运行时,不知道元组是否实际表示记录.编译器在运行时使用的记录定义也不可用.因此,为了在可能的情况下读取记录语法并将元组作为记录打印,记录定义必须由shell本身维护.用于读取,定义,遗忘,列出和打印记录的shell命令如下所述.请注意,每个作业都有自己的一组记录定义.为方便起见,每次启动新作业时,都会读取模块中的记录定义shell_default和user_default(如果已加载).例如,

  -include_lib("kernel/include/file.hrl").
Run Code Online (Sandbox Code Playgroud)

to user_default使shell中的file_info定义很容易获得.

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

档案foo.hrl:

-record(foo, {bar, baz=5}).
Run Code Online (Sandbox Code Playgroud)

档案user_default.erl::

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

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

 %% more stuff probably ...
Run Code Online (Sandbox Code Playgroud)

让我们试试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}
Run Code Online (Sandbox Code Playgroud)

→shell知道foo.hrl的记录