【问题标题】:erlang -import not workingerlang -import 不起作用
【发布时间】:2013-05-23 14:38:07
【问题描述】:

我有一个erlang程序,用rebar编译,在新的debian发布后,它不再编译了,抱怨这个:

-import(erl_scan).
-import(erl_parse).
-import(io_lib).

说:

错误的导入声明

我不知道erlang,我只是想编译这个东西。 显然,-import 最近发生了一些不好的事情http://erlang.org/pipermail/erlang-questions/2013-March/072932.html

有没有简单的方法来解决这个问题?

【问题讨论】:

    标签: linux erlang


    【解决方案1】:

    您的问题是您使用的是实验性的 -import(Mod) 指令,它是参数化模块的一部分。这些在 R16B 及以后的版本中消失了。

    我经常建议不要使用导入。它损害了快速搜索和外来电话的独特命名。获取一个可以快速扩展名称的编辑器。

    【讨论】:

    • 谢谢,我避免使用参数化模块 :-) 所以我错过了 -import(Mod). 构造。
    【解决方案2】:

    好吧,-import(). 正在工作,但它确实按照您的预期行事。它确实将模块“导入”到您的模块中,也不会出去,找到模块并获取所有导出的函数,并允许您在没有模块名称的情况下使用它们。你像这样使用-import

    -import(lists, [map/2,foldl/3,foldr/3]).
    

    然后您可以调用不带模块名称的显式导入函数,编译器会通过添加模块名称来在语法上转换调用。所以编译器会转换:

    map(MyFun, List) ===> lists:map(MyFun, List)
    

    请注意,这是ALL。没有检查模块是否存在或函数是否被导出,这是一个纯朴素的句法转换。它给你的只是稍微短一点的代码。由于这个原因它很少使用大多数人建议不要使用它。

    还要注意,所有操作的代码单元都是模块,因此编译器根本不进行任何模块间检查或优化。 模块之间的所有操作,例如检查模块是否存在或导出哪些函数,都是在运行时在您调用另一个模块中的函数时完成的。

    【讨论】:

    • 是的,我明白它的作用。我没有写那个代码,我只是想让它工作,如果删除它的工作,显然我想无论如何都没有使用名称转换
    • 无论如何,如果钢筋失败,我会说导入不起作用。
    • @LtWorf 这取决于您所说的不工作是什么意思。您提供的示例是非法语法,这是编译器所抱怨的。所以它从来没有真正尝试做一些导入。在这种情况下,rebar 没有做任何特殊的事情,它使用的是普通的 erlang 解析器和编译器,所以它失败了,因为非法语法导致解析器和编译器失败。
    • 令我困惑的是,它在 1 个月前运行良好,而今天再次运行钢筋却没有。通过工作,我的意思是你可以使用 erl 运行程序,它会做它应该做的事情。
    • 是的 erlang 在 5 月的第 2 周在 debian 中进行了更新。它有 15 个,现在是 16 个。
    【解决方案3】:

    不,没有简单的方法可以解决此问题。必须更新源代码,并且对导入函数的每个引用都以相关模块为前缀。例如,对format 的每次调用都应替换为io_lib:format,尽管您必须知道哪个函数是从哪个模块导入的。

    您可以从删除 -import 指令开始。然后编译应该失败,抱怨未定义的函数。那是您需要提供正确的模块名称的地方。查看io_liberl_scanerl_parse 的文档页面,了解哪些函数在哪个模块中。

    【讨论】:

    • 从所有文件中删除所有导入似乎无需其他修改即可正常工作(正常吗?)
    • 我猜有人已经清理了代码并为所有调用添加了前缀,但忘记取出导入指令。
    • 请注意,那些导入声明(已删除的实验性“包”的一部分)没有导入特定函数,如正常的 -import(ModuleName, [Function1, ..., FunctionN]) , 但模块名称,因此可以使用“foo”而不是“bar.baz.foo”等。导入像 io_lib 这样的名称只是意味着您不必使用前导点来表示“空”命名空间与 .io_lib 中一样。如果包含模块本身不在一个包中(也许曾经是,然后又被重命名),那么导入无论如何都没有效果。
    【解决方案4】:

    首先查看存储在位置$ERL_LIBS 中的内容,通常它指向/usr/lib/erlang/lib。

    【讨论】:

    • 编译工作正常,直到 dist-upgrade 发生,模块存在于系统中
    • 我明白,这就是为什么我试图查看在升级过程中模块是否已被删除或重命名
    猜你喜欢
    • 2018-03-10
    • 2013-03-05
    • 2023-01-21
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多