我正在尝试一些erlang代码,我不知道为什么我们必须在某些地方用括号括起代码才能工作,而在其他地方它也没有括号。是由于运算符优先级(非常不可能),还是由于声明而不是表达式? Erlang新手在这里。请参阅下面的示例。
%% Example from the Programming Erlang book.
-module(lib_misc).
-export([for/3]).
for(Max, Max, F) -> [F(Max)];
for(I, Max, F) -> [F(I)|for(I+1, Max, F)].
我使用上面的函数生成函数列表
lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end) end).
给出像
这样的东西[#Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>,
#Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>,
#Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>,
#Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>,
#Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>]
接下来我尝试立即调用函数来获取计算结果,三个不同的变体产生相同的结果并将其分配给变量L
。
L = lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end) end).
lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end ()) end). %% [2,4,6,8,10,12,14,16,18,20]
lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end)() end). %% [2,4,6,8,10,12,14,16,18,20]
lib_misc:for(1, 10, fun (X) -> fun () -> 2*X end() end). %% [2,4,6,8,10,12,14,16,18,20]
问题出在我打电话
时lists:nth(3, L)().
,它给出了错误* 1: syntax error before: '('
。为什么这不给6
? lists:nth()
是一个函数,在这种情况下返回另一个函数。究竟是什么导致了这个问题呢?
在括号中包装语句会给出预期的结果,但为什么会这样呢?
(lists:nth(3, L))(). %% 6
同样,将返回值赋给变量并调用它也可以,但这很明显。
-module(test).
-export([l/0, t/0]).
l() -> lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end) end).
%% t() -> lists:nth(3, l())(). %% test.erl:5: syntax error before: '('
t() -> lists:nth(3, l()). %% works.
如果问题出在语句表达式的东西上,在这段代码中fun (X) -> fun () -> 2*X end() end
是内部匿名函数,是一个语句还是一个表达式?
感谢。
答案 0 :(得分:3)
这只是Erlang语法中优先规则的影响。 (并且Erlang中没有语句,只有表达式。)