gpt4 book ai didi

Erlang 函数名称在运行时被更改

转载 作者:行者123 更新时间:2023-12-01 15:22:31 24 4
gpt4 key购买 nike

我有一个运行在版本 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 定义啤酒的解析转换,如下所示:

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,...},...},...}}],...},...]]},...}}

我不明白函数名称如何更改/转换为“-have_pieces/1-lc$^0/1-0-”,如上所示。这可能是因为某些解析转换吗?任何帮助将不胜感激。

最佳答案

-have_pieces/1-lc$^0/1-0-have_pieces 函数中匿名函数的名称。您可以从名称看起来乱七八糟的事实中看出。

匿名函数名中的-lc代表“列表理解”,所以这个匿名函数就是由此而来。

失败是因为 PiecesInfo 是一个数组(它在错误中显示为 {array,...),而列表理解需要列表。

关于Erlang 函数名称在运行时被更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48527454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com