1

如何测试流的 cdr 是否等于 promise?我正在尝试编写如下所示的内容:

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

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

4

2 回答 2

2

那是行不通的,“承诺”还没有价值。找到它的价值的唯一方法是强迫它或以其他方式评估它。根据它的实现方式,它可能是一个没有参数的函数,等待被调用或延迟对象,等待被强制执行。这有点像海森堡不确定性原理的情况 - 在您评估之前,您无法知道任意承诺的价值。

当然,如果您评估承诺,则比较很简单。因为从问题中不清楚正在使用什么流库,所以我将假设使用delay(或者:)lazyforce(如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
于 2013-03-29T15:33:38.670 回答
1

Apromisedelay(并且,在某些 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))

很少(从不?)是真的。

于 2013-03-29T20:02:57.650 回答