如何测试流的 cdr 是否等于 promise?我正在尝试编写如下所示的内容:
(equal? (stream-cdr s) #<promise>)
它告诉我语法 # 不正确,那么正确的写法是什么?
那是行不通的,“承诺”还没有价值。找到它的价值的唯一方法是强迫它或以其他方式评估它。根据它的实现方式,它可能是一个没有参数的函数,等待被调用或延迟对象,等待被强制执行。这有点像海森堡不确定性原理的情况 - 在您评估之前,您无法知道任意承诺的价值。
当然,如果您评估承诺,则比较很简单。因为从问题中不清楚正在使用什么流库,所以我将假设使用delay
(或者:)lazy
和force
(如SICP中定义的)的临时奇数流实现,如下所示:
(define-syntax stream-cons
(syntax-rules ()
((stream-cons head tail)
(cons head (delay tail))))) ; also works using `lazy` in place of `delay`
(define (stream-car stream)
(car stream))
(define (stream-cdr stream)
(force (cdr stream)))
正如我所说,如果首先评估承诺,则比较将很简单:
(define promise (delay 42)) ; also works using `lazy` in place of `delay`
(define stream (stream-cons 16 42))
promise
=> #<promise:promise>
(equal? (stream-cdr stream) promise)
=> #f
(equal? (stream-cdr stream) (force promise))
=> #t
Apromise
是delay
(并且,在某些 Scheme 方言中,make-promise
)的返回值。您可以测试此值与任何您喜欢的值的相等性。例如:
> (define my-promise (delay "I'll always be good"))
> (equal? "I'll always be good" my-promise)
#f # a string is not a promise
在您的特定情况下#<promise>
,是一个不可读的承诺的方案值的印刷表示。打印的表示不是一个值,因此您的 Scheme 实现会抱怨(“无法读取”)。相反,如果您绑定#<promise>
了某些东西,例如some-promise
,您可以尝试:
(equal? (stream-cdr s) some-promise)
请注意,承诺不是它的价值。一个承诺,当被强制时,返回一个值。那是:
(equal? some-promise (force some-promise))
很少(从不?)是真的。