私は 4clojure の問題に取り組んでいますが、同様の問題が発生し続けています。1 つを除くすべてのテスト ケースで機能するソリューションを作成します。通常、遅延評価をチェックしているものです。以下の解決策は、最後のテスト ケースを除くすべてのテスト ケースで機能します。私はあらゆる種類の解決策を試しましたが、整数オーバーフローまで評価を停止するようには見えません。Joy of Clojure の遅延シーケンスに関する章を読みましたが、それらを実装するのに苦労しています。ループなどを使用しないなど、私が忘れている経験則はありますか?
; This version is non working at the moment, will try to edit a version that works
(defn i-between [p k coll]
(loop [v [] coll coll]
(let [i (first coll) coll (rest coll) n (first coll)]
(cond (and i n)
(let [ret (if (p i n) (cons k (cons i v)) (cons i v))]
(recur ret coll))
i
(cons i v )
:else v))))
好奇心旺盛な人のための究極のソリューション:
(fn i-between [p k coll]
(letfn [(looper [coll]
(if (empty? coll) coll
(let [[h s & xs] coll
c (cond (and h s (p h s))
(list h k )
(and h s)
(list h )
:else (list h))]
(lazy-cat c (looper (rest coll))))
))] (looper coll)))