如何评估Scheme中函数返回的符号?

时间:2013-06-01 13:06:38

标签: scheme symbols evaluation guile

我不熟悉Scheme,我遇到的问题可能反映了我的基本误解。

假设我在Scheme中执行以下操作(在这种情况下使用Guile,但在Chicken中使用相同的内容):

> (define x 5)
> x
5
> (string->symbol "x")
x
> (+ 5 (string->symbol "x"))
<unnamed port>:45:0: In procedure #<procedure 1b84960 at <current input>:45:0 ()>:
<unnamed port>:45:0: In procedure +: Wrong type: x
> (symbol? (string->symbol "x"))
#t
> (+ 5 x) ; here x is dereferenced to its value 5
10
> (+ 5 'x) ; here x is not dereferenced
<unnamed port>:47:0: In procedure #<procedure 1c7ba60 at <current input>:47:0 ()>:
<unnamed port>:47:0: In procedure +: Wrong type: x    

我了解string->symbol正在返回一个有效引用的符号x。但是,我无法弄清楚如何在任何后续环境中使用string->symbol返回的符号。我如何让Scheme评估该符号?

为了说明我为什么要这样做的背景,那就是我正在编写一个带有嵌入式Guile的C程序。我希望能够通过C中的名称访问Guile中定义的符号,例如使用scm_from_*_symbolscm_string_to_symbol。这些功能没有像我认为的那样工作的原因与我上面的核心问题有关。也许有更好的方法来做我想用Guile做的事情,但这是一个不同的问题。现在我对上面的基本问题感兴趣。

3 个答案:

答案 0 :(得分:3)

在这个意义上,符号并不特别,即它们比普通字符串更容易评估

符号很像一个字符串,它周围没有引号。那么,根本的区别当然不是缺少引号,而是符号实习的事实。这意味着字符串"x""x"是两个不同的字符串(尽管它们相等),而符号'x'x实际上是相同的对象

答案 1 :(得分:3)

你想要的是评估符号(而不是“取消引用”它)。我想这就是你的意思:

(define x 5)
(+ 5 (eval 'x (interaction-environment)))
=> 10

请查看documentation了解更多详情。

答案 2 :(得分:1)

您应该阅读Guile文档的fly-evaluation章节。

您想eval,可能interaction-environment

我建议您阅读着名的SICP和Queinnec的Lisp In Small Pieces

相关问题