在方案

时间:2015-07-18 13:16:04

标签: queue scheme

我正在尝试理解以下代码,用于将项目添加到方案中的头部队列中。代码取自方案编程语言(Link to the chapter)。

(define make-queue
  (lambda ()
    (let ((end (cons 'ignored '())))
      (cons end end)))) 

(define putq!
  (lambda (q v)
    (let ((end (cons 'ignored '())))
      (set-car! (cdr q) v)
      (set-cdr! (cdr q) end)
      (set-cdr! q end))))

我不明白这段代码是如何同时修改队列和头部的。根本没有在此功能中调用队列(车辆q)。如果我一个接一个地手动完成这些步骤,我可以看到修改(cdr q)同时修改(car q)但我不明白为什么。这是我手动添加项目的终端输出(加载上面的代码后):

(define myq (make-queue))
(display myq) => ((ignored) ignored)
(set-car! (cdr myq) 'a)
(display myq) => ((a) a)
(set-cdr! (cdr myq) (cons 'ignored '()))
(display myq) => ((a ignored) a ignored)
(set-cdr! myq (cons 'ignored '()))
(display myq) => ((a ignored) ignored)

让我特别困惑的是这套车!和第一集 - cdr!修改列表和头部,但第二个设置 - cdr!只修改头部。如果有人能告诉我这里发生了什么,我真的很感激,因为没有多少重读这一章有助于它更有意义。

1 个答案:

答案 0 :(得分:1)

这完全是因为letmake-queuecar的{​​{1}}和cdr引用同一个对象。因此,当您改变myqcar时,您正在使用相同的对象。但是cdr不是。所以改变它不会影响另一个对象。

myq