【发布时间】:2013-10-31 19:31:00
【问题描述】:
我正在尝试一些 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 是内部匿名函数是语句还是表达式?
谢谢。
【问题讨论】:
标签: erlang