gpt4 book ai didi

elixir - 如何理解编译好的 Elixir Erlang 函数名

转载 作者:行者123 更新时间:2023-12-04 08:51:25 26 4
gpt4 key购买 nike

在 ExProf 中,Elixir 函数名称在编译后被打印出来,我认为是它们的 Erlang 名称。一个例子是

Enum.reduce/3

打印为
'Elixir.Enum':'-reduce/3-lists^foldl/2-0-'/3

我如何解析这个字符串? -lists^foldl/2-0- 在哪里部分来自?为什么会有多个 /3 ?为什么有些名字 -前缀? ^ 是什么意思意思是?为什么 2-0- ?

最佳答案

How do I parse this string?


'Elixir.Enum':'-reduce/3-lists^foldl/2-0-'/3是 Erlang 中的函数引用语法,引用了一个名为 -reduce/3-lists^foldl/2-0- 的函数在模块 Elixir.Enum , 数量为 3,类似于 &Enum."-reduce/3-lists^foldl/2-0-"/3在 Elixir 中。

Where does the -lists^foldl/2-0- part come from?


-$fn/$arity-$something-$count-是 Erlang 在堆栈跟踪(显然是分析输出)中为 $fn/$arity 中定义的匿名函数返回的名称.通常,您会看到类似 -main/0-fun-0- 的内容。 ,即 $something == "fun" ,例如,这个:
defmodule Foo do
def main do
try do
(fn -> raise("foo") end).()
rescue
_ -> IO.inspect System.stacktrace
end
end
end

打印:
[{Foo, :"-main/0-fun-0-", 0, [file: 'foo.ex', line: 4]},
{Foo, :main, 0, [file: 'foo.ex', line: 4]},
{:erl_eval, :do_apply, 6, [file: 'erl_eval.erl', line: 670]},
{:elixir, :erl_eval, 3, [file: 'src/elixir.erl', line: 223]},
{:elixir, :eval_forms, 4, [file: 'src/elixir.erl', line: 211]},
{Code, :eval_string, 3, [file: 'lib/code.ex', line: 168]},
{Kernel.CLI, :wrapper, 1, [file: 'lib/kernel/cli.ex', line: 437]},
{Enum, :"-map/2-lists^map/1-0-", 2, [file: 'lib/enum.ex', line: 1184]}]

只是你不太可能看到 -fun- Elixir 的默认错误消息中的那些,因为它们是 normalized , 至 anonymous fn/0 in Foo.main/0在这种情况下(这就是为什么我通过显式调用 System.stacktrace/0 来打印上面的堆栈跟踪)。

那么 lists^foldl/2 在哪里?来自?那是 generated by sys_core_fold_lists , 一个模块 called by sys_core_fold 对于定义 inline_list_funcs 的模块compile 属性(Elixir 中的 Enum 模块 does do that ),它“从列表模块中内联高阶列表函数”。这种内联还为匿名函数提供了名称“lists^foldl/2”,而不仅仅是“有趣”。

这是一个简单的演示:
defmodule Fold do
@compile :inline_list_funcs

def main do
sum([1, 2, 3])
end

def sum(list) do
:lists.foldl(fn a, b -> raise "foo" end, 0, list)
end
end

Fold.main

@compile :inline_list_funcs ,输出为:
** (RuntimeError) foo
fold.exs:9: anonymous fn/2 in Fold.sum/1
fold.exs:9: Fold."-sum/1-lists^foldl/2-0-"/3
(elixir) lib/code.ex:363: Code.require_file/2

没有它,输出是:
** (RuntimeError) foo
fold.exs:9: anonymous fn/2 in Fold.sum/1
(stdlib) lists.erl:1263: :lists.foldl/3
(elixir) lib/code.ex:363: Code.require_file/2

有了这个属性,我们就没有 lists 的任何堆栈跟踪条目。模块,即使我们显式调用 :lists:foldl .

Why are there multiple /3?



这似乎是 Erlang 的副作用,包括命名匿名函数时当前函数的数量。

Why are some names - prefixed?



解释如上。

What does the ^ mean?



只是一个名字 sys_core_fold_lists:call/4 选择。

Why the 2-0-?


2来自 sys_core_fold_lists:call/4 . 0referred to as "count" in Exception.format_mfa/3 但我不确定这意味着什么。

关于elixir - 如何理解编译好的 Elixir Erlang 函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38507755/

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