1

ストリームの cdr が promise と等しいかどうかをテストするにはどうすればよいですか? 私は次のようなものを書こうとしています:

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

構文 # が正しくないことがわかりますが、これはどのように書くのが正しいのでしょうか?

4

2 に答える 2

2

それは機能しません。「約束」には値がありません-まだ。その値を見つける唯一の方法は、それを強制するか、それ以外の方法で評価することです。実装方法に応じて、引数のない関数で呼び出されるのを待っているか、強制されるのを待っている遅延オブジェクトである可能性があります。ハイゼンベルグの不確定性原理の状況のようなものです。評価するまで、任意のプロミスの値を知ることはできません。

もちろん、promise を評価すれば、比較は簡単です。delayどのストリーム ライブラリが使用されているかという質問からは明確ではないため、次のように、 (alternatively: lazy) およびforce(as defined in 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)))

前述したように、Promise が最初に評価される場合、比較は簡単です。

(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)

promise はその値ではないことに注意してください。promise は、強制されると値を返します。あれは:

(equal? some-promise (force some-promise))

めったに(決して?)真ではありません。

于 2013-03-29T20:02:57.650 に答える