我怎么能解释我的Scheme代码的这种意外行为?

时间:2013-12-14 06:15:59

标签: scheme

我试图定义一个像'(()())这样的数据结构初始化函数,这样我以后就可以生成很多。

在我定义它之后,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) ())
> 

1 个答案:

答案 0 :(得分:5)

init函数返回(list '() '())而不是'(() ())。这将导致它在每次调用时返回一个新列表。

'(() ())这样的文字数据是不可变的。这意味着尝试使用set-car!对其进行变异具有未定义的行为。这样做的原因是允许实现在每次评估时返回相同的文字数据实例,因此在这种情况下,使用原始代码,每次调用init实际上都返回相同的列表。