【问题标题】:Dynamic name resolution动态名称解析
【发布时间】:2011-01-25 01:43:49
【问题描述】:

为什么某些语言(如 PHP 和 Python)使用 dynamic name resolution

我唯一一次想到使用它就是执行类似 Python 代码的操作,这样我就不必将参数显式地传递给 format

"{a} {b} {c} {d}".format(**locals())

但要明确表达并不需要太多工作(并且不太容易出错):

"{a} {b} {c} {d}".format(a=a, b=b, c=c, d=d)

对于在同一范围内设置/获取本地人,我不明白为什么有人会使用它而不是地图。

如果没有动态名称解析,就会发现拼写错误,并且您可以自动重命名变量而不会破坏您的程序(除非某些东西仍然可以读取变量的名称)。使用动态名称解析,您可以省去输入一行的内容吗?我错过了什么吗?

Python 文档说他们将来可能会删除它。是不是更具有历史意义?动态名称解析的实际好用例是什么?

【问题讨论】:

    标签: language-design


    【解决方案1】:

    大多数动态类型语言根本没有选择。对于像x.y 这样的表达式,您不能静态查找y,因为可用字段取决于x 的类型,而x 仅在运行时可用。

    有一些方法可以解决这个问题(例如类型推断或 JIT),但是由于基础语言必须具有动态名称查找功能,因此大多数此类语言都将其变成了一项功能(例如,参见Lua 表)。

    【讨论】:

    • 您的示例似乎比名称解析更具动态类型,不是吗?
    • 您说的是动态确定的对象的属性集。我在这里谈论的“动态名称解析”是本地/全局范围不是静态确定的。例如f() { return x + 1 } 将在运行时失败,即使很明显 x 不在任何范围内(假设 f 是顶级函数而不是某个对象的一部分)。我猜在对象情况下,如果语言允许在没有this/self 等的情况下隐式引用属性,并且对象的方法可以在运行时更改,那么您需要动态范围解析。
    • Longpoke:不好意思,才看到这个。在这种情况下,没有正当理由假设该语言是词法​​范围的。我能想到的唯一原因是,为了方便起见,它就像在早期实现中那样(特别是如果它具有意外的动态范围功能),并且他们一直懒于修复它,因为担心会破坏一些极端情况。
    猜你喜欢
    • 2023-03-14
    • 2019-02-26
    • 1970-01-01
    • 2021-11-02
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    相关资源
    最近更新 更多