【问题标题】:Do Erlang or Elixir do resolve by name in a way that requires "name mangling"?Erlang 或 Elixir 是否以需要“名称修改”的方式按名称解析?
【发布时间】: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/2foo/3。您可以执行 apply(Fun, Args1)apply(Fun, Args2) 并选择合适的 - 这让大门敞开,有效地可变参数或咖喱函数定义级联。只需注意您的类型并进行透析。
  • // , @zxq9,你如何将这个问题改写成它的伟大命运?另外,zxq9,似乎第一条评论可能意味着建议将我的问题编辑为关于 Erlang 中“名称修饰”的含义。

标签: erlang elixir name-mangling


【解决方案1】:

如果您所说的“名称修饰”是指来自 C++ 的概念,那么不,我认为他们不会。

在 Erlang 或 Elixir 中没有函数重载。 (我试图找到一个指向你的来源,但相信我 - 它只是不存在。)函数仅由 arity 选择,具有两个不同 arity 的相同函数名称是两个不同的函数。 f/0 与 f/1 不同,f/1 与 f/2 不同。正如@zxq9 在 cmets 中指出的那样,由于这个属性,Erlang 或 Elixir 中也没有可变参数,尽管这可以通过将列表作为参数传递来模拟。

Erlang 文档的portion 讨论了 Erlang 如何确定要解析的函数。虽然 Elixir 的底层机制相同,但语法不同。

【讨论】:

  • 这种对函数、名称和参数的处理是内置在 VM 中的,因此无法绕过它。您可以通过将参数放入您提到的列表中来伪造它(我已经做到了),但您无法绕过它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多