【发布时间】:2015-11-11 23:00:19
【问题描述】:
“arity”的概念是否解决了这个问题?
我快速浏览了http://www.erlang.org/doc/man/global.html,但它似乎主要涉及节点注册,而不是函数或原子的名称解析。
CosNaming (http://www.erlang.org/doc/man/CosNaming_NamingContext.html) 会处理这个问题吗?
【问题讨论】:
-
“名称修改”是什么意思?在任何情况下,Erlang 和 Elixir 通过 name + arity 显式解析函数 - 没有像 C 中那样的函数重载,并且无法定义可变参数函数(尽管取决于您需要可变参数函数的原因,列表参数往往很好地涵盖了这一点并且是语义上更精确)。我在关于 Elixir 函数导入和名称解析的答案中对此进行了一些讨论:stackoverflow.com/questions/26644258/…
-
// ,“名称修改”是一个很好讨论的术语。我的意思是这里作为编程语言中标识符重载问题的常见解决方案。 (如果在多个上下文中使用相同的名称或具有多个含义,则标识符被“重载”。)
-
在特定语言/运行时的上下文中,它的定义很明确,但每个都有不同的含义,这就是我问的原因(例如,考虑 C、Python 和 Java 中的名称修改)。无论如何,在 Erlang VM 中,
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-mangling