【问题标题】:Erlang: using include from the console?Erlang:从控制台使用包含?
【发布时间】:2011-04-13 21:10:29
【问题描述】:

include directive 通常用于 .erl 文件顶部的 .hrl 文件。

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

我正在尝试在模块中使用一些功能。我已经从控制台编译了 erl 文件。但是,如果不访问 hrl 文件,我想使用的功能将无法工作。

有什么建议吗?

【问题讨论】:

  • 你到底是什么意思? -include 指令是一个编译时特性。如果您已成功编译该文件,则其中需要包含文件中的“事物”的任何函数都将拥有它们,编译器会对此进行检查。因此,编译后这些函数将在不访问包含文件的情况下工作。什么是行不通的?您缺少哪种访问权限?
  • 我正在寻找安装具有 hrl 文件 (github.com/lambder/jsonerl) 的 jsonerl。我想直接从 shell 中使用 hrl 字段中的函数,而不是编写文件然后编译它。

标签: erlang module include


【解决方案1】:

“但是,如果不访问 hrl 文件,我想使用的功能将无法工作。”

这不可能是真的,但据此我会猜测您想要访问您(通常)在 shell 中没有的 hrl 文件中的记录。

如果您执行rr(MODULE),您将加载在MODULE 中定义的所有记录(包括在MODULE 包含的包含文件中定义的那些)。

然后你就可以从 shell 做你需要做的一切了。

(您可能想要进行测试的另一件事是将行 -compile(export_all) 添加到您的 erl 文件中。丑陋,但有时对测试很有用。)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 列表中元组的第一个元素代表什么 .. i ?我认为第二个元素可以代表 .hrl 文件的路径...
    • 原子i,表示要包含第二个元素。
    • 感谢 manoj... 这可能有效。但对于我的用例,它似乎没有。我正在尝试从 erlang 控制台运行此模块 github.com/lambder/jsonerl
    • 你能发布示例代码吗?一个使用hrl的小sn-p,我试试看能不能在这里工作。
    • 我对项目进行了克隆(使用 sudo git clone),然后在文件夹中以 root 身份启动 erl。然后在第一行我做( compile:file("jsonerl.erl", [{i, "jsonerl.hrl"}]. 我收到 ok message. 然后我做 rd(artist, artist, {name, year_of_birth, city,照片,电影})。这将创建记录并工作。我在项目的文档中创建变量 Artist。现在我做一个变量:Json = jsonerl:record_to_json(artist, Artist)。那是我收到错误的时候。
    【解决方案3】:

    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)
    

    我不知道作者为什么选择将它们实现为宏;这看起来很奇怪,但我相信他有他的理由。

    【讨论】:

      猜你喜欢
      • 2012-10-17
      • 2017-11-13
      • 2011-11-20
      • 1970-01-01
      • 2019-05-05
      • 2014-04-22
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多