1
 (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 中运行它们,但它们不起作用。为什么?

4

3 回答 3

3

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

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

举个例子。

>(define pair (cons 1 2))
>pair
(1 . 2)
>(set-car! pair 3)
(3 . 2)
于 2008-11-18T23:53:27.680 回答
2

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

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

于 2008-11-18T23:37:56.667 回答
-2

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

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

于 2008-11-19T00:25:20.877 回答