我在第20版下运行了一个erlang OTP应用程序。 在其中一个gen_statem模块中,我有以下代码片段:
state_bitfield(internal, bitfield, #state{} = State) ->
maybe_send_bitfield(State),
{next_state, state_operate, State}.
maybe_send_bitfield(#state{pieces_info = PiecesInfo} = State) ->
lager:info("Calling have_pieces"),
case have_pieces(PiecesInfo) of
true -> send_bitfield(State);
_ -> lager:info("Not sending bitfield as no pieces.")
end.
have_pieces(PiecesInfo) ->
length([ ok || {Status, _, _} <- PiecesInfo, Status == 3 ]) > 0.
另外我使用erlang.mk为lager定义解析变换,如下所示:
ERLC_COMPILE_OPTS= +'{parse_transform, lager_transform}' +debug_info
ERLC_OPTS += $(ERLC_COMPILE_OPTS)
代码编译得很好,但在运行时我得到以下错误:
22:56:12.454 [error] Lager event handler error_logger_lager_h exited
with reason {'EXIT',{{case_clause,['peer_fsm:4516571b-8f41-4d1b-a9cf-
bf06fc31d54e',
{internal,bitfield},some_term,error,function_clause,state_functions,
[{peer_fsm,'-have_pieces/1-lc$^0/1-0-',[{array,27,0,undefined,
{{{0,undefined,0,[],0},{0,undefined,0,[],0},
{0,undefined,0,...},...},...}}],...},...]]},...}}
我不明白函数名称如何被更改/转换为&#34; -have_pieces / 1-lc $ ^ 0 / 1-0 - &#34;如上所示。 这可能是因为一些解析变换? 任何帮助将不胜感激。
答案 0 :(得分:2)
-have_pieces/1-lc$^0/1-0-
是have_pieces
函数中匿名函数的名称。你可以看出这个名字看起来很糟糕。
匿名函数名中的-lc
代表“list comprehension”,所以这个匿名函数来自于此。
它失败了,因为PiecesInfo
是一个数组(错误中显示为{array,...
),列表推导需要列表。