首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案: eval函数的正确应用?

方案: eval函数的正确应用?
EN

Stack Overflow用户
提问于 2011-04-26 16:33:25
回答 2查看 1.9K关注 0票数 0

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

代码语言:javascript
复制
(let ((a #t))
  (wr "a is ..."
    (eval '(if a "true" "false"))))

当运行这段代码时,我总是收到一条错误消息,告诉我变量'a‘是未知的。所以问题是:你知道如何在当前环境中评估冻结的代码吗?

附言:我使用bigloo编译器。

/

在使用Chris建议的方法时,我遇到了另一个有趣的问题,case关键字的用法。下面的两个示例都使用了相同的case结构,应该会触发"yes!“的输出。线路。不幸的是,它们的行为不同。

通常的->输出是“是!”不出所料:

代码语言:javascript
复制
  (define testit "test")
  (case testit
    (("test")
     (begin (newline) (write "yes!") (newline)))
    (else
      (begin (newline) (write "no!") (newline)))))

With eval ->的输出结果出人意料地是“否”:

代码语言:javascript
复制
  (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))))) 

这有什么意义吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-26 20:21:03

eval不能访问词法变量,比如使用let定义的变量。

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

代码语言:javascript
复制
(define env (null-environment 5))
(eval '(define a #t) env)
(wr "a is ..."
    (eval '(if a "true" "false") env))
票数 5
EN

Stack Overflow用户

发布于 2011-05-04 00:29:17

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5787835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档