Programming languages 什么时候形式参数不隐藏外部变量? 序言

Programming languages 什么时候形式参数不隐藏外部变量? 序言,programming-languages,Programming Languages,因此,我正在学习C编程语言,这句话深深打动了我: 自动变量(包括形式参数)还隐藏外部变量和同名函数 例如: intx; //f的内部x与外部f不同。 空f(双x){} TL;博士 这一点在我看来对所有语言都是正确的(它可以追溯到Lambda Calc),但它却被写进了这本书。是否有这样一个例子,变量的最局部定义不会覆盖更全局的定义?这绝对不是语言的必要条件。碰巧我能想到的所有语言都是这样处理它们的作用域的。为什么?可能是因为这么长时间以来都是这样做的,这对编译器和程序员来说都是最有意义的(想想

因此,我正在学习C编程语言
,这句话深深打动了我:

自动变量(包括形式参数)还隐藏外部变量和同名函数

例如:

intx;
//f的内部x与外部f不同。
空f(双x){}
TL;博士 这一点在我看来对所有语言都是正确的(它可以追溯到Lambda Calc),但它却被写进了这本书。是否有这样一个例子,变量的最局部定义不会覆盖更全局的定义?

这绝对不是语言的必要条件。碰巧我能想到的所有语言都是这样处理它们的作用域的。为什么?可能是因为这么长时间以来都是这样做的,这对编译器和程序员来说都是最有意义的(想想堆栈)

然而,当我在学校的时候,我用一种解释性语言做了一个实验,在这种语言中,符号被放在一个队列中。因此,最全局的作用域凌驾于局部作用域之上。该语言仍然有效,功能齐全。唯一的区别是局部作用域被全局作用域覆盖。归根结底,这只是在更全局的范围内小心命名。

这绝对不是语言的必要条件。碰巧我能想到的所有语言都是这样处理它们的作用域的。为什么?可能是因为这么长时间以来都是这样做的,这对编译器和程序员来说都是最有意义的(想想堆栈)


然而,当我在学校的时候,我用一种解释性语言做了一个实验,在这种语言中,符号被放在一个队列中。因此,最全局的作用域凌驾于局部作用域之上。该语言仍然有效,功能齐全。唯一的区别是局部作用域被全局作用域覆盖。归根结底,这只是在更全局的范围内小心命名。

这是一场斗争,但我发现全局变量覆盖局部变量的能力非常非常弱。这不算什么,但这是我能找到的全部


我确信这一解释包含在K&R中,因为他们不想假设以前的编程经验。局部范围凌驾于全局范围是我们大多数人的第二天性,但一个新鲜的头脑不会有这种知识。明确地陈述它会让你思考为什么它可能是真的,这会带来启示!:)

这是一场斗争,但我发现一个非常非常弱的全局变量凌驾于局部变量之上。这不算什么,但这是我能找到的全部


我确信这一解释包含在K&R中,因为他们不想假设以前的编程经验。局部范围凌驾于全局范围是我们大多数人的第二天性,但一个新鲜的头脑不会有这种知识。明确地陈述它会让你思考为什么它可能是真的,这会带来启示!:)

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

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

但是,如果我没有弄错的话,参数列表在Lisp
(defun foo(bar)(print bar))(defun parameter bar 1)(foo 2)中始终是神圣不可侵犯的。当然,Perl没有参数列表,所以它可以做任何它想做的事情。@cwallenpool,我不认为参数列表是sacrosact;相反,任何会在变量与其最近的封闭参数列表之间引入动态绑定的内容在词汇上也是显而易见的(例如,
let
form)。OTOH,如果你有一个嵌套函数defination(使用
flet
labels
,IIRC),其主体引用外部参数列表中的变量,我希望你仍然可以观察动态范围。但是,如果我没有弄错的话,参数列表在Lisp
(defun foo(bar)(print bar))(def参数栏1)(foo 2)中总是神圣不可侵犯的
打印2。当然,Perl没有参数列表,所以它可以做任何它想做的事情。@cwallenpool,我不认为参数列表是sacrosact;相反,任何会在变量与其最近的封闭参数列表之间引入动态绑定的内容在词汇上也是显而易见的(例如,
let
form)。OTOH,如果你有一个嵌套函数定义(使用
flet
labels
,IIRC),其主体引用外部参数列表中的变量,我希望你仍然可以观察动态范围。啊,这种语言被称为h——或者类似的东西……它是由一名研究生编写的,不是真正的语言。是我把它修改成使用队列的。啊,这种语言叫h——或者类似的东西……它是一个研究生写的,不是真正的语言。是我把它修改为使用队列的。