【问题标题】:Erlang function name getting changed at runtimeErlang 函数名称在运行时更改
【发布时间】:2018-07-09 16:40:23
【问题描述】:

我有一个在 20 版下运行的 erlang OTP 应用程序。 在一个 gen_statem 模块中,我有以下代码 sn-p:

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-”的,如上所示。 这可能是因为一些解析转换吗? 任何帮助将不胜感激。

【问题讨论】:

    标签: erlang erlang-shell


    【解决方案1】:

    -have_pieces/1-lc$^0/1-0-have_pieces 函数内的匿名函数的名称。你可以从这个名字看起来错位的事实中看出。

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

    它失败了,因为PiecesInfo 是一个数组(它在错误中显示{array,...),并且列表推导需要列表。

    【讨论】:

    • 令人费解的是为什么它被视为匿名函数。
    • 不是。你有一个匿名函数 inside 它。
    • 函数名包含“-lc”,表示它是编译列表推导的产物。
    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多