我在 javascript 中有类似于方案的 lisp。它可以与词法和动态范围一起使用。我不确定动态范围是如何工作的,它似乎没问题,但是当范围是动态时,这段代码不起作用:
(define Y
(lambda (h)
((lambda (x) (x x))
(lambda (g)
(h (lambda args (apply (g g) args)))))))
(define (trampoline f)
(lambda args
(let ((result (apply f args)))
(while (eq? (type result) "function")
(set result (result)))
result)))
(define (! n)
((trampoline (Y (lambda (f)
(lambda (n acc)
(if (== n 0)
acc
(lambda ()
(f (- n 1) (* n acc)))))))) n 1))
(print (! 1000))
当范围是词法时它工作正常。当范围是动态的时,此代码是否应该工作?现在它什么也不做,我不知道为什么,但想确保在我开始调试之前这段代码应该工作,并因此使我的动态范围中断。
我的带有演示的 lisp 在这里https://jcubic.github.io/lips/但是使它适用于词法范围的代码尚未发布,因此它不起作用。(它在 devel 分支中,我可以用它或使用 Stack Snippet 创建 codepen 演示)。