Pee*_*ger 12 erlang erlang-shell
这开始是一个问题:
几乎每次我使用Erlang shell时,我都想在shell启动时运行一些命令,例如
rr("*.hrl").
Run Code Online (Sandbox Code Playgroud)
或类似的.目前我必须在每次启动Erlang shell时键入它,我已经厌倦了它并且一直忘记它.
但这实际上是错误的问题!我真正想要做的是在每个shell作业中读取我的记录定义标题.不能用于启动时运行的其他shell内置命令.所以我更改了问题标题以显示它应该如何询问的问题.
Pee*_*ger 15
在尝试使用.erlang的解决方案时,我偶然发现了针对特定rr/1用法的解决方案:
从shell的man-page:
有一些支持在shell中读取和打印记录.在编译期间,记录表达式被转换为元组表达式.在运行时,不知道元组是否实际表示记录.编译器在运行时使用的记录定义也不可用.因此,为了在可能的情况下读取记录语法并将元组作为记录打印,记录定义必须由shell本身维护.用于读取,定义,遗忘,列出和打印记录的shell命令如下所述.请注意,每个作业都有自己的一组记录定义.为方便起见,每次启动新作业时,都会读取模块中的记录定义shell_default和user_default(如果已加载).例如,
Run Code Online (Sandbox Code Playgroud)-include_lib("kernel/include/file.hrl").
to user_default使shell中的file_info定义很容易获得.
为了澄清,我添加了一些例子:
档案foo.hrl
:
-record(foo, {bar, baz=5}).
Run Code Online (Sandbox Code Playgroud)
档案user_default.erl
::
-module(user_default).
-compile(export_all).
-include("foo.hrl"). % include all relevant record definition headers here
%% more stuff probably ...
Run Code Online (Sandbox Code Playgroud)
让我们试试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}
Run Code Online (Sandbox Code Playgroud)
→shell知道foo.hrl的记录