【发布时间】:2018-06-13 19:05:45
【问题描述】:
我有simple lisp implementation based on scheme in JavaScript。默认情况下它具有词法范围,但我刚刚添加了动态范围作为选项。我如何测试我是否正确实现了这一点:
此代码打印 20 和 30:
(define (foo x) (* x y))
(define y 1)
(let ((y 2))
(print (foo 10))
(let ((y 3))
(print (foo 10))))
所以值 y 是动态的,因为它为函数 foo 发生了变化,我还需要做些什么来使 lisp 动态化吗?
let 和函数调用是唯一可以观察动态范围的地方吗?
【问题讨论】:
-
@coredump 如果变量未绑定,则它取自执行 is 的范围,这是动态范围,所以我认为它仅适用于函数和 let。我在问是这样还是我需要做其他事情才能使 lisp 动态化?
-
“Lisp 是使用 S-Expressions 的语言家族” - 对于更广泛的 Lisp 家族中的语言来说,s-expression 既不是必要的,也不是充分的。参见 Logo、RLISP、Dylan 等。
-
Scheme 和一些 Lisp 可能在很多方面有所不同:例如变量和函数是否在不同的命名空间中。例如,Common Lisp 支持变量的动态绑定,但不支持函数。
-
函数调用..
((lambda (y) (print (foo 10))) 2),但这和let一样.. -
您可能还想检查以下内容(假设
y不是全局2:((let ((y 2)) (lambda () y))),不应该返回2。如果您有异常或其他非本地传输您想要检查绑定在它们存在时是否正常工作的控制权。
标签: lisp dynamic-scope