如何在调试时读取/解码Erlang中列表解析的临时函数名称

Pee*_*ger 6 debugging erlang list-comprehension

当调试foo具有列表推导的模块(例如)临时函数名称时,例如

foo:'-loop/4-lc$^2/1-3-'
Run Code Online (Sandbox Code Playgroud)

可以在跟踪输出或错误消息中找到.如果许多列表推导在一个模块中,通常很难找出哪一个正在运行.

如何解释函数名称?

这些函数的调用参数有什么意义?

返回值的含义是什么?

Ada*_*erg 7

字段可以描述如下:

foo:'-loop/4-lc$^2/1-3-'
^     ^    ^ ^   ^ ^ ^
1     2    3 4   5 6 7
Run Code Online (Sandbox Code Playgroud)
  1. 模块名称
  2. 封闭功能
  3. 封闭功能的Arity
  4. 乐趣的类型(lc=列表理解中的列表生成器,列表推导中的blc二进制生成器,=二进制解析中的lbc列表生成器,fun= fun)
  5. 定义函数内的函数索引(基于0)
  6. 生成函数的Arity
  7. lambda的索引在定义函数内提升函数

开放式问题:这些函数的参数和返回值的含义是什么?

刚刚在罗伯特·维丁(Robert Virding)的问题上偶然发现了关于erlang-questions 邮件列表的相同问题.


创建这些名称的代码分布在许多模块中:sys_pre_expand对于乐趣; v3_core为理解而创造的功能; v3_kernel当lambda解除函数时,它会增加更多.所有这一切的目标是创建"唯一的"函数名称,这些函数名称也可以指示函数创建的原因和原因.

sys_pre_expand.erl为代码创建函数名称之前有代码:

%% new_fun_name(State) -> {FunName,State}.

new_fun_name(#expand{func=F,arity=A,fcount=I}=St) ->
    Name = "-" ++ atom_to_list(F) ++ "/" ++ integer_to_list(A)
        ++ "-fun-" ++ integer_to_list(I) ++ "-",
    {list_to_atom(Name),St#expand{fcount=I+1}}.
Run Code Online (Sandbox Code Playgroud)

这些名称在稍后的传递(v3_kernel)中传递和扩展.

来自编译器v3_core.erl:

%% new_fun_name(Type, State) -> {FunName,State}.

new_fun_name(Type, #core{fcount=C}=St) ->
    {list_to_atom(Type ++ "$^" ++ integer_to_list(C)),St#core{fcount=C+1}}.
Run Code Online (Sandbox Code Playgroud)

因此,这解释了示例中的"lc $ ^ 2"(第4和第5部分).当看着它被使用的可能值第4部分地方可以推导出:lc,blclbc.

v3_kernel.erl这些函数被提升的下一阶段是:

%% new_fun_name(Type, State) -> {FunName,State}.

new_fun_name(Type, #kern{func={F,Arity},fcount=C}=St) ->
    Name = "-" ++ atom_to_list(F) ++ "/" ++ integer_to_list(Arity) ++
    "-" ++ Type ++ "-" ++ integer_to_list(C) ++ "-",
    {list_to_atom(Name),St#kern{fcount=C+1}}.
Run Code Online (Sandbox Code Playgroud)

这解释了-loop/4-(第2部分和第3 -3-部分)和(第7部分).在对此的调用中添加了第6部分new_fun_name/2.


(这篇文章是一个社区维基,如果你知道它们是什么意思,请添加其他条目)