Clojure で循環参照するような関数定義
(defn f1 [] (lazy-seq (cons 0 (f2)))) (defn f2 [] (lazy-seq (cons 1 (f3)))) (defn f3 [] (lazy-seq (cons 2 (f1))))
こうすると f1 の評価タイミングで f2 が存在しないのでコンパイラがエラーを吐くんだけどどうしたらいい?という話。
回答は declare を使いましょう、とのこと。
user> (declare f1) #'user/f1 user> (declare f2) #'user/f2 user> (declare f3) #'user/f3
もしくは
user> (declare f1 f2 f3) #'user/f3
のようにしても上手く動きますよ、と。
user> (declare f1 f2 f3) #'user/f3 user> (defn f1 [] (lazy-seq (cons 0 (f2)))) #'user/f1 user> (defn f2 [] (lazy-seq (cons 1 (f3)))) #'user/f2 user> (defn f3 [] (lazy-seq (cons 2 (f1)))) #'user/f3 user> (take 20 (f3)) (2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0)