(define x 44) (define y 25)
(let ((x 12) (y 23)) (if #f (eval x) (eval y)))
上面的代码返回 25,因为 eval 使用了全局变量。如何创建类似于 eval 但在看到变量引用时查找局部变量的东西?
最佳答案
不确定您使用的是什么方案,但在 Racket 中我得到了不同的答案:
> (define x 44)
> (define y 25)
> (let ((x 12) (y 23)) (if #f (eval x) (eval y)))
23
这是我在任何 Scheme 或 Lisp 中所期望的行为。我想你是想在 eval
中引用 x
和 y
:
> (let ((x 12) (y 23)) (if #f (eval 'x) (eval 'y)))
25
现在我们得到了您期望的结果。如果您不引用 eval
的参数,那么它会被评估,然后作为值而不是表单传递给 eval
。在前一种情况下,您最终得到 (eval y)
--> (eval 23)
--> 23。但是,您可以使用 quasi-quoting 来利用它,有选择地取消引用要在当前范围内评估的变量:
> (let ((x 12) (y 23)) (eval `(if #f ,x ,y)))
23
关于scheme - Scheme 中的 Eval 访问词法变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20026656/