Scheme 方案:正确应用评估功能?
在工作中,我在尝试使用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”未知。所以问
(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))