0

我正在尝试一些 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: '('。为什么这不给6lists: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中,内部匿名函数是语句还是表达式?

谢谢。

4

1 回答 1

3

这只是 Erlang 语法中优先规则的影响。(而且 Erlang 中没有语句,只有表达式。)

于 2013-10-22T19:54:35.747 回答