我正在尝试一些 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
中,内部匿名函数是语句还是表达式?
谢谢。