考虑这两个类似的程序:
(define (append-internal-cons obj)
(let ((local-var (cons 1 '()) ))
(append! local-var (list obj))
local-var))
(define (append-internal-no-cons obj)
(let ((local-var '(1) ))
(append! local-var (list obj))
local-var))
鉴于这两个辅助程序:
(define (append! x y)
(set-cdr! (last-pair x) y)
x)
(define (last-pair ls)
(if (null? (cdr ls))
ls
(last-pair (cdr ls))))
调用第一个三次会产生预期结果:包含1
的列表以及我们传入的obj
。
(append-internal-cons 2) ;; (1 2)
(append-internal-cons 3) ;; (1 3)
(append-internal-cons 4) ;; (1 4)
我希望调用第二个版本三次以产生相同的结果,但事实并非如此。
(append-internal-no-cons 2) ;; (1 2)
(append-internal-no-cons 3) ;; (1 2 3)
(append-internal-no-cons 4) ;; (1 2 3 4)
这两个程序的行为不应该相同吗?