Erlang或Elixir是否以要求“使用”的方式按名称解析;名称:mangling;?

Erlang或Elixir是否以要求“使用”的方式按名称解析;名称:mangling;?,erlang,elixir,name-mangling,Erlang,Elixir,Name Mangling,“arity”的概念解决了这个问题吗 我快速看了一下,但它似乎主要涉及节点注册,而不是函数或原子的名称解析 CosNaming()处理这个问题吗 Erlang或Elixir中没有函数重载。(我试图找到一个源代码来告诉你,但相信我,它根本不存在。)函数是单独按算术选择的,同一个函数名和两个不同的算术就是两个不同的函数。f/0与f/1不同,f/1与f/2不同。正如@zxq9在评论中指出的,由于该属性,Erlang或Elixir中也没有变量arity,尽管可以通过将列表作为参数传递来模拟 这两个Erl

“arity”的概念解决了这个问题吗

我快速看了一下,但它似乎主要涉及节点注册,而不是函数或原子的名称解析

CosNaming()处理这个问题吗 Erlang或Elixir中没有函数重载。(我试图找到一个源代码来告诉你,但相信我,它根本不存在。)函数是单独按算术选择的,同一个函数名和两个不同的算术就是两个不同的函数。f/0与f/1不同,f/1与f/2不同。正如@zxq9在评论中指出的,由于该属性,Erlang或Elixir中也没有变量arity,尽管可以通过将列表作为参数传递来模拟

这两个Erlang文档讨论了Erlang如何确定要解析哪个函数。虽然下面的机制对于灵丹妙药来说是一样的,但是语法不同。

如果用“名字修饰”,你是指C++的概念,那么我认为它们不是。p> Erlang或Elixir中没有函数重载。(我试图找到一个源代码来告诉你,但相信我,它根本不存在。)函数是单独按算术选择的,同一个函数名和两个不同的算术就是两个不同的函数。f/0与f/1不同,f/1与f/2不同。正如@zxq9在评论中指出的,由于该属性,Erlang或Elixir中也没有变量arity,尽管可以通过将列表作为参数传递来模拟


这两个Erlang文档讨论了Erlang如何确定要解析哪个函数。对于长生不老药,下面的机制是相同的,但语法是不同的。

你说的“名称混乱”是什么意思?在任何情况下,Erlang和Elixir都是通过name+arity显式解析函数的——不像C中那样存在函数重载,并且无法定义可变函数(尽管根据需要可变函数的原因,列表参数往往能够很好地涵盖这一点,并且在语义上更加精确)。我在这里的一个关于Elixir函数导入和名称解析的回答中对此进行了讨论:/,“名称损坏”是一个讨论得很好的术语。我在这里的意思是作为编程语言中重载标识符问题的通用解决方案。(如果在多个上下文中使用相同的名称或具有多个含义,则标识符是“重载的”)。在特定语言/运行时的上下文中,标识符定义得很好,但每个标识符都有不同的含义,这就是我问的原因(例如,考虑C与Python与Java中的名称混乱)。无论如何,在ErlangVM中,name/arity是一个特定的、显式的标识,不能四处传播。就像Python这样的语言“似乎缺少功能X或Y”一样,这里的省略是故意设计的标志,而不是冲动的选择,并且是程序员思考语言的核心。这就是为什么我认为这是一个很好的问题——也许换个说法会是一个很好的问题。对此我忘了提一个警告(我真的应该把这一切都写在答案中,但它已经过了我的就寝时间……也许明天),函数名是原子,这意味着,如果您将公共标识符作为原子传递,则确实可以通过名称引用N-arity函数。假设您有
Args1=[1,2,3]
Args2=[1,2]
和两个函数
foo/2
foo/3
。您可以执行
apply(Fun,Args1)
apply(Fun,Args2)
操作,然后选择合适的一个操作,这将为有效的可变或电流级联函数定义敞开大门。只要看看你的类型和透析。//,你会如何将这个问题重新表述为它的伟大命运,@zxq9?另外,zxq9,第一条评论似乎意味着建议将我的问题编辑成关于“名称损坏”在Erlang中的含义。您所说的“名称损坏”是什么意思?在任何情况下,Erlang和Elixir都是通过name+arity显式解析函数的——不像C中那样存在函数重载,并且无法定义可变函数(尽管根据需要可变函数的原因,列表参数往往能够很好地涵盖这一点,并且在语义上更加精确)。我在这里的一个关于Elixir函数导入和名称解析的回答中对此进行了讨论:/,“名称损坏”是一个讨论得很好的术语。我在这里的意思是作为编程语言中重载标识符问题的通用解决方案。(如果在多个上下文中使用相同的名称或具有多个含义,则标识符是“重载的”)。在特定语言/运行时的上下文中,标识符定义得很好,但每个标识符都有不同的含义,这就是我问的原因(例如,考虑C与Python与Java中的名称混乱)。无论如何,在ErlangVM中,name/arity是一个特定的、显式的标识,不能四处传播。就像Python这样的语言“似乎缺少功能X或Y”一样,这里的省略是故意设计的标志,而不是冲动的选择,并且是程序员思考语言的核心。这就是为什么我认为这是一个很好的问题——也许换个说法会是一个很好的问题。对此我忘了提一个警告(我真的应该把这一切都写在答案中,但它已经过了我的就寝时间……也许明天),函数名是原子,这意味着,如果您将公共标识符作为原子传递,则确实可以通过名称引用N-arity函数。假设您有
Args1=[1,2,3]
Args2=[1,2]
和两个函数
foo/2
foo/3
。您可以执行
apply(Fun,Args1)
apply(Fun,Args2)
操作,然后选择合适的一个操作,这将为有效的可变或电流级联函数定义敞开大门。只需观察你的类型并进行透析。//,你会如何将这个问题重新表述为