gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:34:30 25 4
gpt4 key购买 nike

使用列表推导式临时函数名称调试模块(例如 foo)时,例如

foo:'-loop/4-lc$^2/1-3-'

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

如何解释函数名称?

这些函数的调用参数的含义是什么?

返回值的含义是什么?

最佳答案

这些字段可以描述如下:

foo:'-loop/4-lc$^2/1-3-'
^ ^ ^ ^ ^ ^ ^
1 2 3 4 5 6 7
  1. 模块名称
  2. 封闭函数
  3. 封闭函数的数量
  4. fun 的类型(lc = 列表理解中的列表生成器,blc = 列表理解中的二进制生成器,lbc = 列表二进制理解中的生成器,fun = fun)
  5. 定义函数内的函数索引(从 0 开始)
  6. 生成函数的数量
  7. 定义函数内 lambda 提升函数的索引

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

刚刚偶然发现this answer by Robert Virding erlang-questions 邮件列表上的同一问题。

<小时/>

创建这些名称的代码分布在许多模块中:sys_pre_expand 是为了好玩; v3_core 用于为推导式创建的函数;和 v3_kernel ,它在 lambda 提升函数时添加了更多内容。所有这一切的目标是创建“唯一”的函数名称,这也给出了创建函数的原因和原因的一些指示。

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

%% 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}}.

这些名称将在后续传递 (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}}.

因此,这说明了示例中的“lc$^2”(第 4 部分和第 5 部分)。当查看使用它的地方时,可以推断出第 4 部分的可能值:lcblclbc

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

%% 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}}.

这说明了-loop/4-(第2部分和第3部分)和-3-(第7部分)。第 6 部分添加到对此 new_fun_name/2 的调用中。

<小时/>

(这篇文章是一个社区维基,如果您知道其他条目的含义,请添加它们)

关于debugging - 调试时如何读取/解码 Erlang 中列表理解的临时函数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6019447/

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