2

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

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

说:

进口申报不良

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

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

4

4 回答 4

10

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

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

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

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

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

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

于 2013-05-28T19:15:56.453 回答
2

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

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

于 2013-05-28T14:59:45.307 回答
2

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

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

于 2013-05-29T09:48:00.507 回答
-3

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

于 2013-05-28T14:56:00.090 回答