这开始作为一个问题:几乎每次在Erlang的外壳,我怎么能自动读取所有的记录定义页眉
当我使用Erlang的外壳,我想运行shell启动一些命令,例如像
rr("*.hrl").
或类似。目前,我必须在每次启动一个Erlang shell时输入它,而且我已经厌倦了它并一直忘记它。
但是这实际上是错误的问题!对于我真正想要做的是在每个shell作业中读取我的记录定义头文件。不能用于启动时运行的其他shell内置命令。所以我改变了问题标题以显示问题应该如何提出。
这开始作为一个问题:几乎每次在Erlang的外壳,我怎么能自动读取所有的记录定义页眉
当我使用Erlang的外壳,我想运行shell启动一些命令,例如像
rr("*.hrl").
或类似。目前,我必须在每次启动一个Erlang shell时输入它,而且我已经厌倦了它并一直忘记它。
但是这实际上是错误的问题!对于我真正想要做的是在每个shell作业中读取我的记录定义头文件。不能用于启动时运行的其他shell内置命令。所以我改变了问题标题以显示问题应该如何提出。
尝试与.erlang的解决方案,我在为特定的RR/1功能的解决方案跌跌撞撞
有阅读和打印一些支持记录在shell中。 在编译期间,记录表达式被转换为元组表达式。在运行时,它不知道一个元组是否实际上代表一个 记录。编译器使用的记录定义在 运行时也不可用。因此,如果可能的话,为了读取记录语法和打印元组作为 记录,记录定义必须由 外壳本身维护。下面描述了用于阅读,定义,遗忘,列表和打印记录的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}
→外壳知道从foo.hrl
将其放在您的主目录中的名为.erlang
的文件中(请参阅http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html中的段落1.7.1)。
从外壳的手册页:
当shell启动文件.erlang
评估记录,但它是不在外壳的背景下进行评估。这意味着它只能包含被评估的通用表达式而不包含shell命令。不幸的是rr()
是一个shell命令(它初始化本地shell的数据来识别记录),因此它不能在.erlang
文件中使用。
尽管用户定义的模块user_default
,其必须被预加载,可包括使用-include
或-include_lib
含有记录定义文件,这些记录定义将仅提供给内user_default
定义的函数。 user_default
是正常编译的模块和它导出的函数调用任何其他功能,因此该记录定义不会在壳体内可见。 user_default
允许用户定义更复杂的函数,这些函数可以在shell中作为shell命令调用。
编辑:
我在这里是部分错误。当我正要正确.erlang
如何评估,如何在user_default
功能被称为我错过user_default.erl
如何在shell启动扫描记录定义其随后可在壳体内。感谢@Peer Stritzinger指出了这一点。
你确定吗?手册页中的文字似乎是另有说明。为了检查我设置了一个小测试用例(请参阅http://ideone.com/4Gau5)看起来它似乎工作。我错过了什么吗? – 2010-11-01 22:31:12
不,你没有错过任何东西。我正在检查代码,只看到'shell_default'和'user_default'中的函数的使用,并且在shell启动时错过了对它们的扫描。 Mea culpa。 – rvirding 2010-11-02 11:07:17
对于RR的例子()我有困难,使这项工作。对于一个如果我只放线如上.erlang没有找到RR/1陈述,我不知道是什么模块RR/1中定义的。在另一方面,我不知道这将是可用在所有壳工作。 – 2010-11-01 19:56:40
@Peer Stritzinger:'rr()'没有被定义为一个函数;你可以在'stdlib/shell.erl'中找到它作为'local_func/7'函数的一个子句。 – Zed 2010-11-01 20:55:50
@Zed:是的,这是我的问题,我正在寻找一种方法来自动调用它。在我自己的答案中解决该变通方法,因为我无法想到启动时需要的任何其他shell内置伪函数,该解决方案为我解决了该问题。 – 2010-11-01 21:30:32