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