【问题标题】:When do formal parameters not hide external variables?形参什么时候不隐藏外部变量?
【发布时间】:2011-09-10 05:14:09
【问题描述】:

序言

所以,我正在浏览The C Programming Language,这句话让我印象深刻:

自动变量,包括形参,也会隐藏外部变量和同名函数。

例子:

int x;

// x inside of f is different from external f.
void f(double x){}

TL;DR

这让我觉得所有语言都必须如此(它可以追溯到 Lambda Calc。),但它却被写进了本书。是否存在变量的最局部定义不覆盖更全局定义的示例?

【问题讨论】:

    标签: programming-languages


    【解决方案1】:

    它绝对不是语言的必要条件。碰巧我能想到的所有语言都以这种方式处理它们的范围。为什么?可能是因为这就是它长期以来的做法,而且对于编译器和程序员来说都是最有意义的(想想堆栈)。

    但是,在我上学的时候,我用一种解释语言做了一个实验,其中符号被排成一列。因此,最全局范围会覆盖本地范围。该语言仍然有效并且功能齐全。唯一的区别是本地范围被全局范围覆盖。这归结为只是在更全局范围内小心命名。

    【讨论】:

    • 啊,这种语言叫做 h-- 或者类似的东西……它是一个研究生写的,它不是一种真正的语言。我是修改它以使用队列的人。
    【解决方案2】:

    这是一场斗争,但我发现一个非常非常弱的example 全局变量覆盖了本地变量。这不算数,但这是我能找到的全部!

    我确信 K&R 中包含了解释,因为他们不想假设之前的编程经验。局部范围覆盖全局范围是我们大多数人的第二天性,但一个新的头脑不会有这些知识。明确地陈述它会让你思考为什么它可能是真的,这会导致启蒙! :)

    【讨论】:

      【解决方案3】:

      在具有动态作用域的语言中,内部x 不会隐藏外部x,它会修改外部x。请参阅the wikipedia page 上的示例。具有动态作用域的语言,尤其是 Lisp 方言,在编写 K&R 时更为常见。然而,动态范围与任何类型的类型系统的交互都很差,即使是像 C 那样执行松散的类型系统也是如此。

      【讨论】:

      • 但是参数列表,如果我没记错的话,在 Lisp (defun foo(bar)(print bar))(defparameter bar 1)(foo 2) 打印 2 中总是神圣不可侵犯的。当然,Perl 没有参数列表,所以它可以为所欲为。
      • @cwallenpool,我不认为参数列表是神圣的;相反,任何会在变量与其最近的封闭参数列表之间引入动态绑定的东西也是词法上显而易见的(例如,let 形式)。 OTOH,如果您有一个嵌套函数定义(使用fletlabels,IIRC),其主体引用外部参数列表中的变量,我希望您仍然可以观察动态范围。
      猜你喜欢
      • 2015-11-25
      • 2018-11-12
      • 2016-11-21
      • 2011-06-05
      • 2019-07-31
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多