scheme - Scheme 中的 Eval 访问词法变量

标签 scheme lisp eval

(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 中引用 xy:

> (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/

相关文章:

lisp - 我想用 Common Lisp 合并和排序两个排序列表

exec 中的 python 字典理解使用全局变量而不是局部变量

javascript - 使用 JavaScript eval 解析 JSON

javascript - JS : using eval on a function while trying to pass an array as parameter, 但它抛出一个错误

unit-testing - chicken scheme srfi-64 测试错误问题

browser - 是否有运行 JavaScript 以外的脚本语言的功能强大的 Web 浏览器?

scheme - 将 assoc 中的列表附加到 Scheme 中的另一个列表

list - 如何添加到方案中的嵌入式列表?

string - 如何在不引用输出的情况下运行 Racket 程序?

scheme - 需要解释 Lisp 中的反向科学记数法函数