1

我正在关注氮气项目页面上的教程: starter tutorial here

当我将浏览器指向它时,localhost:8000它不起作用。我怀疑这与以下命令有关:

make rel_inets;

/home/david/programming/erlang/nitrogen/nitrogen/rel/nitrogen/lib/erlware_commons/src/ec_cmd_log.erl:160:5: ambiguous call of overridden auto-imported BIF error/3
**-** use erlang:error/3 or "-compile({no_auto_import,[error/3]})." to resolve name clash Compiling /home/david/programming/erlang/nitrogen/nitrogen/rel/nitrogen/lib/erlware_commons/src/ec_cmd_log.erl failed: ERROR: compile failed while processing /home/david/programming/erlang/nitrogen/nitrogen/rel/nitrogen/lib/erlware_commons: rebar_abort make[4]: *** [Makefile:12: compile] Error 1

有谁知道出了什么问题?看起来函数名称之间存在一些冲突。我安装了最新的 erlang 24.0.1,我仍然得到相同的行为。谢谢

4

1 回答 1

3

有谁知道出了什么问题?

下面是一个例子……Erlang 定义了一个函数error/2,称为 BIF 或B uilt I n F函数,可以这样调用:

-module(a).
-compile(export_all).


go(X, Y) ->
    case X > 10 of
        true -> error(bad_arg, [X, Y]);
        false -> ok
    end,
    io:format("hello\n").

在外壳中:

4> c(a).
a.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,a}

5> a:go(1, 2).
hello
ok

6> a:go(11, 2).
** exception error: bad_arg
     in function  a:go/2
        called as a:go(11,2)
7> 

现在,看看如果你定义一个也在error/2你的模块中命名的函数会发生什么:

-module(a).
-compile(export_all).

error(X, Y) ->
   io:format("X = ~w, Y = ~w~n", [X,Y]). 

go(X, Y) ->
    case X > 10 of
        true -> error(bad_arg, [X, Y]);
        false -> ok
    end,
    io:format("hello\n").

在外壳中:

8> c(a).
a.erl:2: Warning: export_all flag enabled - all functions will be exported

a.erl:9: Warning: ambiguous call of overridden auto-imported BIF error/2
 - use erlang:error/2 or "-compile({no_auto_import,[error/2]})." to resolve name clash
{ok,a}

警告告诉你,如果你真的想调用 erlang's error/2,那么你应该在函数名之前加上定义函数的模块名,即erlang模块:

case X > 10 of
    true -> erlang:error(bad_arg, [X, Y]);

...或者,如果你想调用你的版本error/2,然后输入模块指令:

 -compile({no_auto_import,[error/2]}).

在模块顶部:

-module(a).
-compile(export_all).
-compile({no_auto_import,[error/2]}).

error(X, Y) ->
   io:format("X = ~w, Y = ~w~n", [X,Y]). 

go(X, Y) ->
    case X > 10 of
        true -> error(bad_arg, [X, Y]);
        false -> ok
    end,
    io:format("hello\n").


11> c(a).       
a.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,a}

请注意,代码中的问题只是 a warning,当我按照最初编写的方式运行程序时,erlang 调用了error/2我的模块中定义的版本——而不是erlang模块中的版本。

奇怪的是:erlang 模块中没有error/3定义。

于 2021-05-31T00:31:58.753 回答