Pee*_*ger 6 debugging erlang list-comprehension
当调试foo具有列表推导的模块(例如)临时函数名称时,例如
foo:'-loop/4-lc$^2/1-3-'
Run Code Online (Sandbox Code Playgroud)
可以在跟踪输出或错误消息中找到.如果许多列表推导在一个模块中,通常很难找出哪一个正在运行.
如何解释函数名称?
这些函数的调用参数有什么意义?
返回值的含义是什么?
字段可以描述如下:
foo:'-loop/4-lc$^2/1-3-'
^ ^ ^ ^ ^ ^ ^
1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
lc=列表理解中的列表生成器,列表推导中的blc二进制生成器,=二进制解析中的lbc列表生成器,fun= fun)开放式问题:这些函数的参数和返回值的含义是什么?
刚刚在罗伯特·维丁(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,blc和lbc.
在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.
(这篇文章是一个社区维基,如果你知道它们是什么意思,请添加其他条目)
| 归档时间: |
|
| 查看次数: |
315 次 |
| 最近记录: |