【问题标题】:adding items to a headed queue in scheme在方案中将项目添加到有头队列
【发布时间】: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!只修改头部。如果有人能告诉我这里发生了什么,我将不胜感激,因为再多重读这一章也无助于它更有意义。

【问题讨论】:

    标签: queue scheme


    【解决方案1】:

    这都是因为make-queue 内部的letmyqcarcdr 指的是同一个对象。因此,当您对 carcdr 进行变异时,您正在对同一个对象进行操作。但myq 不是。所以变异它不会影响其他对象。

    (define a '(end))
    ;Value: a
    
    (define b a)
    ;Value: b
    
    (define c (cons a b))
    ;Value: c
    
    c
    ;Value 15: ((end) end)
    
    (set-car! (car c) 'HI)
    ;Unspecified return value
    
    c
    ;Value 15: ((hi) hi)
    
    (set-cdr! (cdr c) '(hello))
    ;Unspecified return value
    
    c
    ;Value 15: ((hi hello) hi hello)
    
    (set-cdr! c '(end))
    ;Unspecified return value
    
    c
    ;Value 15: ((hi hello) end)
    

    【讨论】:

    • 谢谢,这清楚地说明了正在发生的事情。我还是不太明白为什么 (set-cdr! (cdr c)) 和 (set-cdr! c) 有如此不同的效果:它们不是都在修改 (cdr c) 吗?如果 (car c) 和 (cdr c) 引用同一个对象,为什么 (set-cdr!c) 只修改了 cdr,而 (set-cdr! (cdr c)) 修改了 car 和 cdr (通过他们所指的对象)。我从结果中知道发生了什么,但我永远无法预测。
    • (set-cdr! (cdr c)) 设置 c 的 cdrcdr,在我的示例中是 b(指的是 a)。它变异了b,而不是c(set-cdr! c) 变异 c,将其 cdrb 更改为 '(end)。我知道这很令人困惑,希望您现在能理解。
    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多