JMP 范围 -- 动态范围与词法范围以及一般混淆学习 JSL如果我错了,请纠正我,但 JMP 似乎具有动态作用域,没有作用域持久性(伪命名空间除外)这里,窗户,盒子)。这与许多流行的编程语言形成鲜明对比,这些编程语言具有词法范围和使用引用计数器的完整范围持久性。
这让我非常头疼,直到我获得了使用 JMP 奇怪的示波器系统所需的直觉,我相信这对许多人来说是一个很大的困惑。没有多少编程语言使用动态作用域(LISP 是一个重要的例外,JSL 与 LISP 有一些相似之处)。
我鼓励 JSL 文档团队指出这种区别,并提供一些有关如何更好地理解动态作用域的资源/链接,因为它肯定不是进行名称解析的标准方法。
这是一个例子——外部函数的局部作用域在 return 语句之后立即被清除,并且内部函数的名称解析是动态的(基于当前的调用堆栈):
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Name Expr( inner function ) );
);
func = outer function;
func()
/*** OUTPUT ***
7如果您在具有作用域持久性的词法作用域语言(例如 Python)中执行功能等效的操作,则内部函数的封闭作用域是持久的(它是外部函数的本地作用域),并且内部函数的名称解析函数的 x 变量是系统词法读取的值 4。由于JMP不使用词法作用域,而是使用动态作用域,那么当内部函数最终在脚本末尾执行时,它使用动态名称解析Local -> Here -> Global(以及可能的column-)当前表的名称)并找到值 7。
理解这种类型的行为对于在 JSL 中构建健壮的程序至关重要,我只想向任何学习/努力使用 JSL 的人指出这一点。
如果您有任何想法/不直观的例子,请告诉我!
自动化和脚本编写数据存取回复:JMP 作用域——动态作用域与词法作用域以及一般混淆学习 JSL这是真的,并且在学习这门语言时确实让我感到困惑。另一个问题是 JSL 是术语重写语言由于它的表达式对象,这意味着虽然在作用域方面是 LISP 式的,但在处理宏的方式方面却不是 LISP 式的。
据我所知,唯一一种流行的术语重写语言是 Wolfram 语言。我对 CS 不够精通,无法肯定地说,但我听到一些人声称术语重写范式严格来说比 Lisp 的宏更强大。另一方面,我听到有人声称 Wolfram 语言只是 m 表达式的实现,而 Lisp 认为 s 表达式已经足够好了。
无论如何,JSL 的表达式系统对几乎所有人来说都是陌生的,并且其处理表达式的功能的人体工程学设计对他们没有任何好处。您可以在这个论坛中找到这么多使用字符串操作和 Parse() 而不是术语重写功能的示例,这是有原因的。
回复:JMP 作用域——动态作用域与词法作用域以及一般混淆学习 JSL我自己不是一个计算机科学的人,但是术语重写的东西很有趣!谢谢你的参考,我现在要在这个兔子洞里整夜不眠......
回复:JMP 范围——动态范围与词汇范围以及学习 JSL 时常见的困惑这
func = outer function;
func();
这让我很困惑。
执行后
func = outer function();
内部函数的定义存储在变量 func 中。
这就是显示(函数)返回的原因
func = Function({},Print(x));
至此,所有关于外部功能和内部功能的信息都消失了。
所以func()将执行Print(x)并...打印7 。
编辑:
实际上,与主帖中写的内容相比,并没有什么新内容。
这只是JSL程序员的“二维视角”。
回复:JMP 范围——动态范围与词汇范围以及学习 JSL 时常见的困惑JMP 会保留函数定义中的变量原样——它不会自动用当前值替换它们。
所以,之后
x = 4;
inner function = Function( {}, Print( x ));
inner function is defined as
Function( {}, Print( x ));
为了使内部函数将其自身的x替换为外部函数中的x ,需要进行一些预评估,例如:
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
Eval(Eval Expr( inner function = Function( {},
x= Expr(x);
Print( x )
)));
Return( Name Expr(inner function));
);
func = outer function;
func() // prints 4
编辑:同样的二维视图,只是换了些文字。
回复:JMP 范围——动态范围与词汇范围以及学习 JSL 时常见的困惑我迅速地朝栅栏那边看了一眼:
def outer():
y=4
def inner():
print(y)
return inner
f = outer()
y = 7
f() # -> 4
所以,Python 返回 3。因为这是定义 inner 时,y 在词法上下文中的定义方式。
是“已定义”还是“已返回”?
我们再来看一遍:
def outer():
y=4
def inner():
print(y)
y=-100
return inner
f = outer()
y = 7
f()
-> -100