测试等于承诺

时间:2013-03-29 15:15:18

标签: scheme racket

如何测试流的cdr是否等于promise?我正在尝试写一些看起来像这样的东西:

(equal? (stream-cdr s) #<promise>) 

它告诉我语法#不正确,那么写这个的正确方法是什么?

2 个答案:

答案 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)

promisedelay的返回值(在某些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))

很少(从不?)是真的。