如何测试流的cdr是否等于promise?我正在尝试写一些看起来像这样的东西:
(equal? (stream-cdr s) #<promise>)
它告诉我语法#不正确,那么写这个的正确方法是什么?
答案 0 :(得分:2)
这不起作用,“承诺”没有价值 - 但是。找到其价值的唯一方法是强制或以其他方式评估它。根据它的实现方式,它可能是一个没有参数的函数,等待被调用或延迟对象,等待被强制。这有点像海森堡的不确定性原则情况 - 你无法知道任何承诺的价值,直到你评估它。
当然,如果你评估这个承诺,比较是直截了当的。因为从问题中不清楚使用什么流库,我将假设使用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
答案 1 :(得分:1)
promise
是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值的不可读印刷表示。打印的表示不是值,因此您的Scheme实现将抱怨(“无法读取”)。相反,如果您将#<promise>
绑定到some-promise
之类的内容,则可以尝试:
(equal? (stream-cdr s) some-promise)
请注意,承诺不是它的价值;承诺,当被强制时,返回一个值。那就是:
(equal? some-promise (force some-promise))
很少(从不?)是真的。