Bas*_*ian 0 scheme eval expression-evaluation bigloo
在工作中,我在尝试使用Scheme实现配置脚本时遇到了一个基本问题.为了避免发明一种人为的和受限制的语言,脚本应该包含实际的代码.稍后将对此代码进行评估.要使配置按需工作,必须能够访问某些变量.这些变量仅在评估的上下文中已知.因此,必须在当前环境中评估配置脚本.这是我所说的一个原始的例子:
(let ((a #t))
(wr "a is ..."
(eval '(if a "true" "false"))))
Run Code Online (Sandbox Code Playgroud)
运行此代码时,我总是收到一条错误消息,告诉我变量'a'未知.所以问题是:你知道如何评估当前环境中的冻结代码吗?
PS:我使用bigloo编译器.
/////////////////////////////////////////////编辑:/// ////////////////////////////////////////////////// /
当使用Chris建议的方法时,我遇到了另一个有趣的问题,即case关键字的用法.以下两个示例都使用相同的case结构,它应该触发输出"yes!".线.不幸的是,他们表现得不同
通常 - >输出是"是的!" 正如所料:
(define testit "test")
(case testit
(("test")
(begin (newline) (write "yes!") (newline)))
(else
(begin (newline) (write "no!") (newline)))))
Run Code Online (Sandbox Code Playgroud)
使用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)))))
Run Code Online (Sandbox Code Playgroud)
这有任何意义吗?
eval无法访问词法变量,例如使用的变量let.
相反,您必须创建一个环境,并使用您想要提供的变量填充它.例如:
(define env (null-environment 5))
(eval '(define a #t) env)
(wr "a is ..."
(eval '(if a "true" "false") env))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1468 次 |
| 最近记录: |