【问题标题】:How do I evaluate a symbol returned from a function in Scheme?如何评估从 Scheme 中的函数返回的符号?
【发布时间】:2013-05-28 04:55:27
【问题描述】:

我正在重新熟悉 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-&gt;symbol 正在返回一个符号x,它被有效地引用了。但是,我无法弄清楚如何在以后的任何上下文中使用 string-&gt;symbol 返回的符号。如何让 Scheme 评估该符号?

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

【问题讨论】:

    标签: scheme symbols evaluation guile


    【解决方案1】:

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

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

    查看documentation了解更多详情。

    【讨论】:

    • 这在 Guile 2.0 上不起作用,因为它的 eval 需要 两个 参数(要评估的东西和环境......)
    • 这个例子不是对数字没有用的评价吗?在应用 eval 之前 x 被评估为 5。
    【解决方案2】:

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

    你想要eval,可能还有interaction-environment

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

    【讨论】:

    • eval 正是我想要的。奇怪,因为我之前尝试过,但我想我一开始做错了。谢谢!
    【解决方案3】:

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

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

    【讨论】:

    • 嗯,这是一个根本性的误解。我将问题标题更正为“取消引用”,这就是我的意思。
    • @BrandonInvergo 同样,您真的可以认为符号是不带引号的字符串。 (+ 5 "x") 没有意义,(+ 5 'x) 也是如此。
    • 如果要将字符串的内容作为 Scheme 代码求值,则不需要符号,需要 eval-string 函数。
    • 实际上是的,可以评估一个符号。
    • @ÓscarLópez 是的,我已将答案中的措辞更改为更准确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多