Имя функции Erlang меняется во время выполнения

У меня есть приложение erlang OTP, работающее под выпуском 20. В одном из модулей, который является 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-", как показано выше. Может ли это быть из-за некоторого преобразования синтаксического анализа? Любая помощь приветствуется.


person Saurav Prakash    schedule 30.01.2018    source источник


Ответы (1)


-have_pieces/1-lc$^0/1-0- — это имя анонимной функции внутри функции have_pieces. Вы можете сказать по тому факту, что имя выглядит искаженным.

-lc в имени анонимной функции означает «понимание списка», поэтому эта анонимная функция происходит от этого.

Это не удается, потому что PiecesInfo - это массив (в ошибке указано {array,...), а для понимания списков требуются списки.

person Roger Lipscombe    schedule 30.01.2018
comment
Непонятно, почему это рассматривается как анонимная функция. - person Saurav Prakash; 30.01.2018
comment
Это не так. У вас есть анонимная функция внутри. - person Roger Lipscombe; 30.01.2018
comment
Имя функции содержит -lc, что указывает на то, что это артефакт компиляции понимания списка. - person RichardC; 30.01.2018