5

我正在重新熟悉 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 做的事情,但这是一个不同的问题。现在我对上面的基本问题感兴趣。

4

3 回答 3

3

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

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

查看文档以获取更多详细信息。

于 2013-06-01T13:19:18.510 回答
2

从这个意义上说,符号并不特殊,也就是说它们并不比普通字符串更容易评估。

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

于 2013-06-01T13:10:00.437 回答
2

您应该阅读Guile 文档的飞行评估一章。

你想要eval并且可能interaction-environment

我推荐阅读著名的SICP和 Queinnec 的Lisp In Small Pieces

于 2013-06-01T13:10:34.003 回答