为什么这段代码在Scheme中不起作用?

时间:2008-11-18 23:30:39

标签: scheme

 (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中运行它们并且它们不起作用。为什么呢?

3 个答案:

答案 0 :(得分:3)

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

对于最后一组表达式,如果要设置一对汽车,请使用函数(set-car!pair val),它与任何方案函数一样,因为它评估所有操作数。它接受两个值,一对和一些方案值,并改变该对,以便汽车现在指向方案值。

例如。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:-2)

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

听起来你正在尝试学习Scheme,你不知道Lisp,是吗?如果是这样,我强烈建议尝试使用Clojure作为一个更容易学习的Lisp。我没有掌握Common Lisp和Scheme中读者,评价,符号,特殊形式,宏等之间的相互作用,因为这些东西似乎都是纠结的,但我终于在Clojure中真正理解了它们。虽然它是新的,但我发现Clojure文档实际上比我在Scheme或CL中发现的更清晰。从http://clojure.blip.tv/处的视频开始,然后阅读clojure.org上的文档。