2014-01-24 16 views
1

我寫了一個程序(do-test)。 由於測試可能對可變env, 我定義envdo-test希望env不會進行 與過程有一定的影響,所以每次我運行它,我會得到一個新的環境中工作。 令我驚訝的是,我的測試程序實際上是承載了以前的env。 請找到follwing代碼:程序中定義的變量是否保留?

(define (do-test) 

    (define env '(1)) 
    ;(define env (list 1)) 

    (display env) 
    (if (not (equal? (car env) 1)) 
    (error "assertion failed.") 
    'ok) 

    (set-car! env 2) 
    'ok) 

(do-test) 
(do-test) 

我試圖運行使用MIT的方案/詭計/ codepad.org這個代碼,所有的 告訴我,乳寧(do-test)兩次產生不同的結果。

但是,如果我將行(define env '(1))更改爲(define env (list 1)),我會得到預期的結果。 (你可以找到我的代碼beforeafter在codepad.org的變化)

據我所知,'(1)(list 1)應該只是第二同樣會調用程序list

我想知道爲什麼會發生這種情況,如何防止程序重複使用以前的值?

回答

0

請看一看R5RS,它說

它是使用像set-car!string-set!的突變過程來改變常數(字面 表達的即值)的誤差。

所以'(1)(list 1)是不完全一樣的東西:當你打算建立一些數據會在未來發生突變,不要用報價。

如果你嘗試這樣做:

(define (f) (list 1)) 
(define (g) '(1)) 
(display (eq? (f) (f)))(newline) 
(display (eq? (g) (g)))(newline) 

您將獲得:

#f 
#t 

這暗示f會做一個清單,每當調用。但g會將其列表'(1)視爲一個常量,並且該列表只分配一次,無論調用次數多少。