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
.
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 thestream-cdr
procedure rather than when the stream is constructed bycons-stream
.