这开始是一个问题:
几乎每次我使用Erlang shell时,我都想在shell启动时运行一些命令,例如
之类的东西rr("*.hrl").
或类似的。目前我每次启动一个Erlang shell时都要输入它,我已经厌倦了它并且一直忘记它。
但这实际上是错误的问题!我真正想要做的是在每个shell作业中读取我的记录定义标题。不能用于启动时运行的其他shell内置命令。所以我改变了问题标题,以显示它应该如何询问的问题。
答案 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段)。