SICP 延迟 "let"

Delayed "let" in SICP

SICP表示CDR已打开:

在第 3.5.4 节中,我看到了这个块:

(define (integral delayed-integrand initial-value dt)
 (define int
  (cons-stream initial-value
             (let ((integrand (force delayed-integrand)))
               (add-streams (scale-stream integrand dt)
                            int))))
int)

通常情况下是这样的:

(define (stream-map proc s)
  (if (stream-null? s)
      the-empty-stream
      (cons-stream (proc (stream-car s))
                   (stream-map proc (stream-cdr s)))))

stream-cdr s 将被评估为 (cons-stream (stream-car (cdr s)) delay<>),即使实际调用会延迟。即,即使 stream-map 函数本身被延迟,参数也是 pre-computed。 [这样对吗? - 通过应用模型,参数应该在函数被“调用”之前替换为,但是当延迟被强制或只是指定时是调用评估]

那为什么不让pre-computed?

我怎么想的?我认为 let 是一个以变量为参数的 lambda 函数,所以它的执行被延迟了

(let ((var1 e1) (var2 e2)) e3)

相同
 Lambda (var1 var2) e3 (with var1 bound to e1 and var2 bound to e2)

有人可以帮我确认一下吗?谢谢

在 SICP 类型流中,流的 car 不会延迟,但 cdr 会延迟。 整个表达式,

(let ((integrand (force delayed-integrand)))
  (add-streams (scale-stream integrand dt)
               int))

被延迟,因为它是 cons-stream 的第二个参数。延迟什么样的表达式并不重要,因此您可以调用、评估变量甚至在那里进行 let。

“参数是预先计算的。这是正确的吗?”

没有。 (cons-stream a (func (stream-cdr b))) 就像

(cons-stream a    
    (lambda ()     
       ;; our code is placed here, verbatim, as a whole:
       (func (stream-cdr b))  
    )  
  )

const-stream 是一个宏,它只是移动代码片段。

lambda 可能包含在 memo-proc 记忆调用中,按需调用,但它仍然有 我们编写的代码,如(func (stream-cdr b)),由cons-stream“按文本”放置在lambda 中。这是一个宏,只是移动代码片段。

关于您添加到问题中的片段,作者只是不够精确。这里的意思是,when (stream-cdr stream) in (stream-filter pred (stream-cdr stream)) will被调用,它will产生(cons 10008 (delay .... )),如图所示。之前没有。

它说“在这种情况下是”应该说“在这种情况下是相同的”。

在第 3.5.1 Streams Are Delayed Lists 节中,该书说:

To make the stream implementation automatically and transparently interleave the construction of a stream with its use, we will arrange for the cdr of a stream to be evaluated when it is accessed by the stream-cdr procedure rather than when the stream is constructed by cons-stream.