我认为我理解为什么在使用动态作用域的语言中允许闭包存在是危险的。也就是说,似乎你可以正确地关闭变量,但是当尝试读取它时,你只会得到全局堆栈顶部的值。如果其他函数在期间使用相同的名称,则可能很危险。
我是否忽略了其他微妙之处?
我认为我理解为什么在使用动态作用域的语言中允许闭包存在是危险的。也就是说,似乎你可以正确地关闭变量,但是当尝试读取它时,你只会得到全局堆栈顶部的值。如果其他函数在期间使用相同的名称,则可能很危险。
我是否忽略了其他微妙之处?
LAMBDA
。只要不尝试返回它们,在动态作用域语言中lambda是完全安全的。
make-adder
、addx
和do-test
是什么吗?从Lisp 1.5手册来看,它们不是函数闭包,尽管使用了lambda
进行定义。它们似乎更像宏,并且被简单的表达式替换(即没有关联环境)。 - wlnirvana