Scheme 方案:正确应用评估功能?

Scheme 方案:正确应用评估功能?,scheme,eval,expression-evaluation,bigloo,Scheme,Eval,Expression Evaluation,Bigloo,在工作中,我在尝试使用Scheme实现配置脚本时遇到了一个基本问题。为了避免发明人工和受限语言的需要,脚本应该包含实际代码。本规范将在以后进行评估。要使配置按预期工作,它必须能够访问某些变量。这些变量仅在评估的上下文中已知。因此,必须在当前环境中评估配置脚本。下面是我所说内容的一个简单示例: (let ((a #t)) (wr "a is ..." (eval '(if a "true" "false")))) 运行这段代码时,我总是会收到一条错误消息,告诉我变量“a”未知。所以问

在工作中,我在尝试使用Scheme实现配置脚本时遇到了一个基本问题。为了避免发明人工和受限语言的需要,脚本应该包含实际代码。本规范将在以后进行评估。要使配置按预期工作,它必须能够访问某些变量。这些变量仅在评估的上下文中已知。因此,必须在当前环境中评估配置脚本。下面是我所说内容的一个简单示例:

(let ((a #t))
  (wr "a is ..."
    (eval '(if a "true" "false"))))
运行这段代码时,我总是会收到一条错误消息,告诉我变量“a”未知。所以问题是:您知道如何在当前环境中评估冻结的代码吗

注:我使用bigloo编译器

///////////////////////////////////////////// 编辑://////////////////////////////////////////////////////

当使用Chris建议的方法时,我遇到了另一个有趣的问题,case关键字的使用。以下两个示例都使用了相同的case结构,这将触发“yes!”行的输出。不幸的是,他们的行为不同

通常->输出为“是”,如预期:

  (define testit "test")
  (case testit
    (("test")
     (begin (newline) (write "yes!") (newline)))
    (else
      (begin (newline) (write "no!") (newline)))))
使用eval->输出令人惊讶地为“否”:


这有什么意义吗?

eval
无法访问词法变量,例如使用
let
定义的词法变量

相反,您必须创建一个环境,并用您希望可用的变量填充它。例如:

(define env (null-environment 5))
(eval '(define a #t) env)
(wr "a is ..."
    (eval '(if a "true" "false") env))

要回答您的编辑,您没有将env作为参数传递给最后一个eval。如果未给出该参数,则eval创建的环境中不存在testit


这可能是一个输入错误,但如果不是,那就是你的问题。

嘿,这确实有效,谢谢!我很好奇,是否有一种更短或更直接的方法来定义变量a inside env,也许是忽略了“'(define..”表达式的计算,比如:(define a#t env)。我还想知道这种计算结构的计算有多耗时。根据R5RS报告(和R7RS报告),由
(null environment 5)
返回的环境可能是不可变的。因此建议的解决方案不可移植。请重新编辑:不要在
大小写中使用字符串
匹配子句。我知道一些/许多方案实现在这两种情况下都输出“否”。只有符号、数字、字符、布尔值和空列表(
()
)可以在
案例中可靠地写入
的匹配项。有关更多详细信息,请参阅。
(define env (null-environment 5))
(eval '(define a #t) env)
(wr "a is ..."
    (eval '(if a "true" "false") env))