2010-09-17 17 views
7

包含directive通常用于.erl文件顶部的.hrl文件。Erlang:从控制台使用include?

但是,我想直接使用Erlang控制台中的include。

我想在模块中使用一些功能。我从控制台编译erl文件。但是,我想使用的功能在无法访问hrl文件的情况下无法使用。

有什么建议吗?

+0

你是什么意思? '-include'指令是一个编译时特性。如果你已经成功地编译了这个文件,那么它的任何需要包含文件的东西的函数都会有它们,编译器会检查它。所以在编译之后,这些函数将无法访问包含文件。它是什么不起作用?你缺乏哪些访问权限? – rvirding 2010-09-18 14:01:32

+0

我期待安装具有hrl文件的jsonerl(http://github.com/lambder/jsonerl)。我想直接从shell中使用hrl场中的函数,而不是编写文件然后编译它。 – 2010-09-19 19:41:19

回答

2

您是否试过compile:file选项?你可以传递一个包含的模块列表:

compile:file("myfile.erl", [{i, "/path/1/"}, {i, "/path/2/"}]) 
+0

列表中元组的第一个元素代表什么?我认为第二个元素可以代表.hrl文件的路径... – 2010-09-17 19:24:39

+0

原子'i',表示第二个元素将被包含。 – 2010-09-17 19:26:59

+0

感谢manoj ......这可能有效。但对于我的用例来说,它似乎并不如此。我尝试从erlang控制台运行此模块http://github.com/lambder/jsonerl – 2010-09-17 19:34:56

8

“但是,我想使用的功能在没有访问hrl文件的情况下无法使用。

这不可能是真实的,但是从这里我可以猜测你想要访问hrl文件中的记录(通常情况下)不在shell中。

如果你做了rr(MODULE),你将加载MODULE中定义的所有记录(包括MODULE包含的包含文件中定义的记录)。

然后,您可以从shell中执行所需的任何操作。

(你可能想要测试的另一件事是行-compile(export_all)添加到您的erl文件。丑,但有时好进行测试。)

2

值得什么,jsonerl.hrl不包含任何功能。它包含宏。据我所知,宏在Erlang只是编译时构造。

使它们可用的最简单方法是自己创建一个.erl文件,它实际上声明了用宏来实现的函数。也许是这样的:

-module(jsonerl_helpers). 
-include("jsonerl.hrl"). 

record_to_struct_f(RecordName, Record) -> 
    ?record_to_struct(RecordName, Record). 

...这,编译后,可以按拨打:

jsonerl_helpers:record_to_struct_f(RecordName, Record) 

我不知道为什么笔者选择了执行这些作为宏;这看起来很奇怪,但我确定他有他的理由。