【发布时间】:2011-04-26 08:33:25
【问题描述】:
在工作中,我在尝试使用 Scheme 实现配置脚本时遇到了一个基本问题。为了避免发明一种人为的和受限制的语言,脚本应该包含实际的代码。稍后将评估此代码。要使配置按需要工作,它必须有权访问某些变量。这些变量仅在评估的上下文中是已知的。因此必须在当前环境中评估配置脚本。这是我所说的一个原始示例:
(let ((a #t))
(wr "a is ..."
(eval '(if a "true" "false"))))
运行此代码时,我总是会收到一条错误消息,告诉我变量“a”未知。那么问题来了:你知道如何评估当前环境中的冻结代码吗?
P.S.:我使用的是 bigloo 编译器。
///////////////////////////////////// 编辑: //////////////////////////////////////////////// //////
当使用 Chris 建议的方法时,我遇到了另一个有趣的问题,即 case 关键字的使用。以下两个示例都使用相同的案例结构,应该触发“是!”的输出。线。不幸的是,它们的行为不同。
通常 -> 输出是“是!”正如预期的那样:
(define testit "test")
(case testit
(("test")
(begin (newline) (write "yes!") (newline)))
(else
(begin (newline) (write "no!") (newline)))))
使用 eval -> 输出令人惊讶的是“否”:
(define env (null-environment 5))
(eval '(define testit "test") env)
(eval '(case testit
(("test")
(begin (newline) (write "yes!") (newline)))
(else
(begin (newline) (write "no!") (newline)))))
这有意义吗?
【问题讨论】:
-
重新编辑:不要在
case匹配子句中使用字符串。我知道一些/许多方案实现在这两种情况下都输出“否”。只有符号、数字、字符、布尔值和空列表 (()) 可以可靠地写入case的匹配项。有关详细信息,请参阅stackoverflow.com/questions/5768696/…。
标签: scheme eval expression-evaluation bigloo