什么是词汇范围?

什么是词汇范围界定的简要介绍

我通过例子来理解它们。:)

首先,词法范围(也称为静态范围),使用类似C的语法:

void fun()
{
int x=5;
void fun2()
{
printf(“%d”,x);
}
}

每个内部级别都可以访问其外部级别

Lisp的第一个实现使用了另一种称为动态范围的方法,同样采用类似C的语法:

void fun()
{
printf(“%d”,x);
}
无效dummy1()
{
int x=5;
乐趣();
}
无效dummy2()
{
int x=10;
乐趣();
}

在这里,fun可以访问dummy1dummy2中的x,或者调用fun的任何函数中声明了x的任何x

dummy1();

将打印5

dummy2();

将打印10

第一个称为静态,因为它可以在编译时推导;第二个称为动态,因为外部范围是动态的,并且取决于函数的链调用

我发现静态范围对眼睛更容易。大多数语言最终都是这样,甚至Lisp(两者都可以,对吗?)。动态作用域类似于将所有变量的引用传递给被调用函数

作为编译器不能推断函数的外部动态范围的一个例子,请考虑我们的最后一个例子。如果我们这样写:

如果(/*某些条件*/)
dummy1();
其他的
dummy2();

调用链取决于运行时条件。如果为真,则调用链如下所示:

dummy1-->乐趣

如果条件为假:

dummy2-->乐趣

在这两种情况下,fun的外部范围都是调用者加上调用者的调用者,依此类推

只需提到,C语言不允许嵌套函数或动态作用域

发表评论