我试图定义一个像'(()())这样的数据结构初始化函数,这样我以后就可以生成很多。
在我定义它之后,init函数可以正常工作。但是在我使用set-car之后!在(let * ...)函数调用中,(init)的行为发生了变化。
我的问题是如何解释这种行为?
; define init func
(define (init)
(display "initializing goal space...")
(newline)
'(() ())
)
; call init func
(init)
; use set-car! in (let* ...)
(let*
((x (init)))
(display x)
(newline)
(set-car! x (list 'foo))
(display x)
(newline)
)
; call init func again
(init)
DrScheme中的输出日志,lang = Textual(MzScheme,包括R5RS)
Welcome to DrScheme, version 372 [3m].
Language: Textual (MzScheme, includes R5RS).
initializing goal space...
(() ())
initializing goal space...
(() ())
((foo) ())
initializing goal space...
((foo) ())
>
答案 0 :(得分:5)
让init
函数返回(list '() '())
而不是'(() ())
。这将导致它在每次调用时返回一个新列表。
像'(() ())
这样的文字数据是不可变的。这意味着尝试使用set-car!
对其进行变异具有未定义的行为。这样做的原因是允许实现在每次评估时返回相同的文字数据实例,因此在这种情况下,使用原始代码,每次调用init
实际上都返回相同的列表。