Scheme:在不同环境中改变局部变量会改变同一个对象

时间:2016-05-28 02:40:58

标签: scheme mutability cons

考虑这两个类似的程序:

(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)

这两个程序的行为不应该相同吗?

0 个答案:

没有答案