我讀了一本書的計劃,它有下面的例子:計劃 - 動態範圍和infinte環
(define map
(lambda (f s)
(if (null? s)
'()
(cons (f (car s))
(map f (cdr s)))))
(map (lambda (s)
(set! s '(1 2 3 4))
'hello)
'(a b c d))
它說,在動態範圍,我們將進入無限循環。但爲什麼?據我瞭解,我們申請後,我們到達與地圖
f = (lambda (s)
(set! s '(1 2 3 4))
'hello)
和s = '(a b c d)
。現在,第一次運行時,我們將在(car '(a b c d)
適用f
:
((lambda (s)
(set! s '(1 2 3 4))
'hello)
(car '(a b c d)))
而現在,它改變a
是(1 2 3 4)
。等等..這裏的循環在哪裏?
這與問題並不完全相關,但對'f'的調用會將'a'改爲''(1 2 3 4)'「是不正確的。 Scheme通過值傳遞函數參數,所以'(set!s)'唯一可以改變的就是當前範圍內變量's'的值。要替換原始列表中的'a',函數必須將整個列表作爲參數並調用'set-car !'。 – 2011-12-23 16:05:51