2010-11-01 70 views
10

这开始作为一个问题:几乎每次在Erlang的外壳,我怎么能自动读取所有的记录定义页眉

当我使用Erlang的外壳,我想运行shell启动一些命令,例如像

rr("*.hrl"). 

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

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

回答

13

尝试与.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

0

将其放在您的主目录中的名为.erlang的文件中(请参阅http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html中的段落1.7.1)。

从外壳的手册页:

+0

对于RR的例子()我有困难,使这项工作。对于一个如果我只放线如上.erlang没有找到RR/1陈述,我不知道是什么模块RR/1中定义的。在另一方面,我不知道这将是可用在所有壳工作。 – 2010-11-01 19:56:40

+1

@Peer Stritzinger:'rr()'没有被定义为一个函数;你可以在'stdlib/shell.erl'中找到它作为'local_func/7'函数的一个子句。 – Zed 2010-11-01 20:55:50

+0

@Zed:是的,这是我的问题,我正在寻找一种方法来自动调用它。在我自己的答案中解决该变通方法,因为我无法想到启动时需要的任何其他shell内置伪函数,该解决方案为我解决了该问题。 – 2010-11-01 21:30:32

2

当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指出了这一点。

+0

你确定吗?手册页中的文字似乎是另有说明。为了检查我设置了一个小测试用例(请参阅http://ideone.com/4Gau5)看起来它似乎工作。我错过了什么吗? – 2010-11-01 22:31:12

+0

不,你没有错过任何东西。我正在检查代码,只看到'shell_default'和'user_default'中的函数的使用,并且在shell启动时错过了对它们的扫描。 Mea culpa。 – rvirding 2010-11-02 11:07:17