【发布时间】:2015-07-18 13:16:04
【问题描述】:
我正在尝试了解以下用于将项目添加到方案中的有头队列的代码。代码取自 The Scheme Programming Language (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))))
我不明白这段代码是如何同时修改队列和头部的。在这个函数中根本没有调用队列(car 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)
让我特别困惑的是固定车!和第一个 set-cdr!修改列表和头部,但第二个 set-cdr!只修改头部。如果有人能告诉我这里发生了什么,我将不胜感激,因为再多重读这一章也无助于它更有意义。
【问题讨论】: