8

これは、ストリームが議論されているSICPの3.5章に関するものです。アイデアは次のとおりです。

(cons-stream 1 (display 'hey))

cons-streamの2番目の部分を評価するべきではないので、「hey」を出力するべきではありません。これは実際に発生します。次の出力が得られます。

hey(1。#<promise>)

だから私の結論は、遅延は特別な形として実装されていないということですか?それとも私は何か間違ったことをしていますか?私は次の実装を使用します:

(define (cons-stream a b) 
  (cons a (delay b)))

遅延がデフォルトのR5RS実装です。これは実装の誤りですか、それとも私はそれを正しく行っていないか、理解していませんか?

4

1 に答える 1

15

あなた約束を作成しますが、約束はあなたの中に作成されますcons-stream。つまり、手遅れであり、式はすでに評価されています。これを試して:

(define (foo x)
  (display "foo: ") (write x) (newline)
  x)

(cons-stream 1 (foo 2))

評価が早すぎることがわかります。同じ理由で、これは:

(define ones (cons-stream 1 ones))

が関数の場合、他の無限リストはcons-stream機能しません。つまり、これは特殊な形式ですが、単純な関数としてdelay定義しているため、その機能は使用していません。同じように特別な動作をさせたい場合は、マクロとして定義cons-streamする必要があります。例えば:cons-stream

(define-syntax cons-stream
  (syntax-rules ()
    [(cons-stream x y) (cons x (delay y))]))
于 2011-04-10T08:07:33.960 に答える