をStackOverflowの私は、次のように書いた:Lazynessと
(fn r [f xs]
(lazy-seq
(if (empty? xs)
'()
(cons (f (first xs)) (r f (rest xs))))))
を解決するために4clojure.comの問題#118:マップなどを使用せずにマップを再実装するように要求し、その解決策が通過するhttp://www.4clojure.com/problem/118
テスト(私はそれが正しいかどうかわからない:それは非常に他のソリューションに近いと述べた)。
問題は、それは私が「ラッピング」怠惰-seqのの私のソリューションによって、上記のコードを書いて怠惰でなければならなかったと述べているので...しかし、私はどのように怠惰-seqの作品を理解していません。
ここでは「怠け者」とは何か、それをどのようにテストできるかはわかりません。
私は(type ...)
を尋ねるとき、私は、当然、clojure.lang.LazySeqを取得するが、私はそれと私は単に怠惰-seqの「ラッピング」を削除した場合、私が得るとの違いだか分かりません。
今、もちろん、私は削除場合怠惰-seqの私はこれを実行しようとしている理由のstackoverflowを取得:
(= [(int 1e6) (int (inc 1e6))]
(->> (... inc (range))
(drop (dec 1e6))
(take 2)))
そうでない場合(つまり:私が代わりに怠惰-seqのラッピングをさせた場合)、それは正常に動作するようです。
だから私は何とか "デバッグ" /それがすべての仕組みを理解しようとしていることを追跡しようとすることにしました。
(defmacro dbg [x] `(let [x# ~x] (println "dbg: " '~x "=" x#) x#))
を、マクロDBG内部の作業バージョンを包み、再びそれを実行しようとしました:私は(私はSO IIRCで見つかった)次のマクロを取りました。そして今、kaboom:うまく動作したバージョンは、今もstackoverflowをスローします。
私はよく分かりません。おそらく、評価されないものの評価を強制するマクロの望ましくない効果でしょうか?誰もがこの単純な機能と簡単なテストを使用して、説明することができれば、lazynessはここで仕事をしてどのように、いつ正確に何を呼び出さ素晴らしいことだ
など
Clojureは '実現?レイジーシーケンスの値が実現されているかどうかをテストするテスト関数。例えば(実現?(範囲))は偽になります。 – NielsK