2013-11-26 11 views
5

これはSICP Book Chapter 3.5.2に関する質問です。SICP無限ストリーム(第3.5.2章)

他のプログラミング言語でストリームデータ構造を実装しています。次のスニペットを正しく理解しているかどうかはわかりません。私は(cons-stream n (integers-starting-from (+ n 1))))を実行して値を返す関数を実行する(integers-starting-from (+ n 1))に理解されるものと

(define (integers-starting-from n) 
    (cons-stream n (integers-starting-from (+ n 1)))) 

(define integers (integers-starting-from 1)) 

cons-streamの第2の仮パラメータは(integers-starting-from (+ n 1))であり、()で囲まれているため、実行を遅らせるのではなく、無限に関数を実行します。

私はこのスニペットを実行する前に、次の整数が実行されているストリームの秒要素前でも無限再帰的につながっているようです。

lectureの中に示されているように、これがなぜスキームで機能するように見えるのですか?

私ではなく、このような何かを記述する必要があります理解してから:

(define (integers-starting-from n) 
    (cons-stream n (lambda() (integers-starting-from (+ n 1))))) 

(define integers (integers-starting-from 1)) 

んこれは、スキームは(integers-starting-from (+ n 1))の実行を遅らせる魔法のいくつかの種類を持っていることを意味?

+1

[SRFI-41](http://srfi.schemers.org/srfi-41/)を参照してください。これは[私のブログ](http: /programmingpraxis.com/essays/#srfi41streams)。このドキュメントでは、 'cons-stream'の実装について詳しく説明しています。 – user448810

答えて

8

トリックは私たちがcons-streamを実装する方法にあり、事前にありがとうございます。 (lambda() ...)サンクを定義すると、明示的に評価の約束を作成しました。特別な形式cons-streamはこれを行いますが、暗黙的にSchemeのプリミティブを使用します。例えば、それは次のように実装することができ、我々はdelayを使用する方法に気づく:それは1つの場所ですべての約束-作成ロジックをカプセル化するために、より理にかなって

(define-syntax stream-cons 
    (syntax-rules() 
    ((stream-cons head tail) 
    (cons head (delay tail))))) 

、明示的にどこにでもサンクを作成する代わりに、cons-streamを言います。

関連する問題