【问题标题】:Why does this code not work in Scheme?为什么这段代码在 Scheme 中不起作用?
【发布时间】:2008-11-18 23:30:38
【问题描述】:
 (define a 42)
 (set! 'a 10)


(define a 42)
(define (symbol) 'a)
(set! (symbol) 10)


(define a (cons 1 2))
(set! (car a) 10)

我尝试在 DrScheme 中运行它们,但它们不起作用。为什么?

【问题讨论】:

  • 您能否提供更多详细信息,例如它如何不起作用?你得到什么输出?错误信息?号码错了吗?

标签: scheme


【解决方案1】:

想想设置!是一种特殊形式,例如 define,它不计算其第一个操作数。您正在告诉方案解释器准确地设置该变量的编写方式。在您的示例中,它不会将表达式 'a 评估为单词 a。相反,它会寻找一个名为“'a”的变量绑定(或者取决于你的解释器可能会在那之前中断,因为我认为'a不是一个有效的绑定)。

对于最后一组表达式,如果您想设置一对汽车,请使用函数 (set-car!pair val),它的工作原理与任何方案函数一样,它会评估其所有操作数。它接受两个值,一对和一些方案值,并改变这对,使汽车现在指向方案值。

例如。

>(define pair (cons 1 2))
>pair
(1 . 2)
>(set-car! pair 3)
(3 . 2)

【讨论】:

    【解决方案2】:

    因为 set 的第一个参数!可以说是变量名,而不是“左值”。

    对于最后一种情况,使用 (set-car!a 10)。

    【讨论】:

      【解决方案3】:

      问题在于 (set!'a 10),因为您不应该引用符号 a

      听起来你正在尝试学习 Scheme,但你不知道 Lisp,是吗?如果是这样,我强烈建议尝试将 Clojure 作为更容易学习的 Lisp。在 Common Lisp 和 Scheme 中,我没能掌握阅读器、求值、符号、特殊形式、宏等之间的交互,因为这些东西似乎都以错综复杂的方式交互,但我终于在 Clojure 中真正理解了它们。尽管它是新的,但我发现 Clojure 文档实际上比我为 Scheme 或 CL 找到的任何东西都更清晰。从 http://clojure.blip.tv/ 的视频开始,然后阅读 clojure.org 上的文档。

      【讨论】:

        猜你喜欢
        • 2010-09-18
        相关资源
        最近更新 更多