17

フィボナッチ数列の clojure コードの例を調べています。

 (def fibs (lazy-cat [1 2] (map + fibs (rest fibs))))

何が起こっているのかは大体理解できますが、要点がわかりませんlazy-cat。私はそれlazy-catが次のようなものに変換されているマクロであることを知っています:

(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs))))) 

一体何をlazy-seq成し遂げているのでしょうか?lazy-seq?がなくても遅延評価されます。これは厳密にキャッシュ目的ですか?

編集:答えてくれてありがとう。私の混乱はconcat、スコープ内の fibs への以前のバインディングがあったため、REPL のプレーンで機能したことでした。

4

2 に答える 2

16

lazy-seqオン[1 2]は必要ありませんが、実際には害はありません。

lazy-seqon(map + fibs (rest fibs))は不可欠です。fibsこれがないと、値にバインドされる前に関数呼び出しが評価され、例外が発生します。でラップすることによりlazy-seq、値が必要になるまで呼び出しが延期され、fibsその時点で値が設定されます。

于 2010-05-31T17:07:14.137 に答える
7

私が理解しているように (そして、私はまだ Clojure の比較的新参者であることを認めています!)、次のことを試してみると:

(def fibs (concat [1 2] (map + fibs (rest fibs))))

その後、fibs がまだバインドされていないため機能しません。したがって、後の 2 つの参照は失敗します。

ただし、fibs への参照は、後でシーケンスが消費されたときにのみ実際に解決されるため、指定した遅延バージョンは機能します。その時点までに、fibs は遅延シーケンスとして正常に定義されています。

于 2010-05-31T17:03:14.803 に答える