我正在重新熟悉 Scheme,我遇到了一个问题,这可能反射(reflect)了我的根本误解。
假设我在 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_*_symbol
或 scm_string_to_symbol
.这些功能没有按照我认为的方式工作的原因与我上面的核心问题有关。也许有更好的方法来做我想用 Guile 做的事情,但这是一个不同的问题。现在我对上面的基本问题感兴趣。
最佳答案
您想要的是评估符号(而不是“取消引用”它)。我想这就是你的意思:
(define x 5)
(+ 5 (eval 'x (interaction-environment)))
=> 10
看看documentation了解更多详情。
关于scheme - 如何评估从 Scheme 中的函数返回的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16873043/