首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang氮气教程项目不起作用

Erlang氮气教程项目不起作用
EN

Stack Overflow用户
提问于 2021-05-30 19:02:07
回答 1查看 89关注 0票数 1

我遵循了氮气项目页面上的教程:starter tutorial here

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

代码语言:javascript
复制
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,但仍然有相同的行为。谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-05-31 08:31:59

有谁知道哪里出了问题吗?

下面是一个定义函数error/2的example...Erlang,称为BIF或Built In F函数,可以这样调用:

代码语言:javascript
复制
-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").

在shell中:

代码语言:javascript
复制
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的函数会发生什么:

代码语言:javascript
复制
-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").

在shell中:

代码语言:javascript
复制
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的error/2,那么应该在函数名之前加上定义函数的模块名称,即erlang模块:

代码语言:javascript
复制
case X > 10 of
    true -> erlang:error(bad_arg, [X, Y]);

...or,如果您想调用您的error/2版本,则将模块指令放入:

代码语言:javascript
复制
 -compile({no_auto_import,[error/2]}).

在模块的顶部:

代码语言:javascript
复制
-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}

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67760388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档