在Erlangshell中,如何自动读取所有记录定义头

在Erlangshell中,如何自动读取所有记录定义头,erlang,erlang-shell,Erlang,Erlang Shell,这首先是一个问题: 几乎每次使用Erlang shell时,我都希望在shell启动时运行一些命令,例如 rr("*.hrl"). 或类似的。目前,每次启动Erlang shell时,我都必须键入它,我对它感到厌倦,并且总是忘记它 但这实际上是个错误的问题!因为我实际上想做的是在每个shell作业中读取我的记录定义头。不用于启动时运行其他shell内置命令。因此,我更改了问题标题,以显示问题应该如何提问。将其放在主目录中名为.erlang的文件中(请参见中的第1.7.1段)。在使用尝试解决方案

这首先是一个问题:

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

rr("*.hrl").
或类似的。目前,每次启动Erlang shell时,我都必须键入它,我对它感到厌倦,并且总是忘记它


但这实际上是个错误的问题!因为我实际上想做的是在每个shell作业中读取我的记录定义头。不用于启动时运行其他shell内置命令。因此,我更改了问题标题,以显示问题应该如何提问。

将其放在主目录中名为
.erlang
的文件中(请参见中的第1.7.1段)。

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

从shell的手册页:

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

  -include_lib("kernel/include/file.hrl").
对于用户\u,默认设置使文件\u信息的定义在中随时可用 贝壳

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

文件
foo.hrl

-record(foo, {bar, baz=5}).
-module(user_default).
-compile(export_all).

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

 %% more stuff probably ...
文件:
user\u default.erl

-record(foo, {bar, baz=5}).
-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

了解记录。启动shell时,将对文件
.erlang
进行评估,但不会在shell上下文中对其进行评估。这意味着它只能包含经过计算的常规表达式,而不能包含shell命令。不幸的是,
rr()
是一个shell命令(它初始化本地shell数据以识别记录),因此不能在
.erlang
文件中使用它

虽然必须预加载的用户定义模块
user\u default
,可以包含包含使用
-include
-include\u lib
的记录定义的文件,但这些记录定义将仅可用于
user\u default
中定义的函数
user\u默认值
是正常编译的模块,其中导出的函数被称为任何其他函数,因此记录定义在shell中不可见
user\u default
允许用户定义更复杂的函数,这些函数可以作为shell命令从shell中调用

编辑:


我在这里有一部分是错的。虽然我对如何计算
.erlang
以及如何调用
user\u default
中的函数的看法是正确的,但我忽略了在shell启动时如何扫描
user\u default.erl
以获取shell中可用的记录定义。感谢@Peer Stritzinger指出这一点。

关于rr()的例子,我很难做到这一点。例如,如果我只在.erlang中放置上面所述的行,那么它找不到rr/1,并且我不知道在中定义了什么模块rr/1。另一方面,我不确定这在所有shell作业中都可用。@Peer Stritzinger:
rr()
未定义为函数;您可以在
stdlib/shell.erl
中找到它,作为
local\u func/7
函数的子句。@Zed:是的,这是我的问题,我一直在寻找自动调用它的方法。在我的自我回答中为解决办法提供资金,因为我想不出启动时需要的任何其他shell内置伪函数,所以这个问题通过解决办法为我解决了。因此,我改变了问题,以显示我应该要求什么,以使这对其他人有用……你确定吗?手册页中的文本似乎另有说明。为了检查,我设置了一个小测试用例(请参阅),因为它看起来很有效。我错过什么了吗?不,你什么都没错过。我正在检查代码,只看到了
shell\u default
user\u default
中函数的使用,没有在shell启动时扫描它们。我有罪。