1

println (例の最後の行) がリスト内包表記のように機能しないのはなぜですか? Clojure で Project Euler の問題 #2 を解決するために、次のコードを試しています。

(def fibsq [0 1])

(defn second-to-last [sq]
  (nth sq (- (count sq) 2)))

(second-to-last fibsq)

(defn add-last-two [sq]
  (+ (last sq) (second-to-last sq)))

(defn add-to-fibsq [sq]
  (if (< (add-last-two sq) 100)
    (add-to-fibsq (conj sq (add-last-two sq)))
    sq))

;; putting it all together
(add-to-fibsq fibsq)

(println [x (add-to-fibsq fibsq) :when (even? x)])

私が得る出力は次のとおりです。

(定義 ||[0 1]|| [0 1])

(defn 最後から 2 番目 [||[0 1 1 2 3 5 8 13 21 34 55 89]||] (n 番目 ||[0 1 1 2 3 5 8 13 21 34 55 89]|| (- (カウント ||[0 1 1 2 3 5 8 13 21 34 55 89]||) 2)))

(最後から 2 番目 ||[0 1]||)|| => 0||

(defn add-last-two [||[0 1 1 2 3 5 8 13 21 34 55 89]||] (+ (last ||[0 1 1 2 3 5 8 13 21 34 55 89]||) (最後から 2 番目 ||[0 1 1 2 3 5 8 13 21 34 55 89]||)))

(defn add-to-fibsq [||[0 1 1 2 3 5 8 13 21 34 55 89]||] (if (< (add-last-two ||[0 1 1 2 3 5 8 13 21 34 55 89]||) 100) (fibsq に追加 (conj ||[0 1 1 2 3 5 8 13 21 34 55 89]|| (最後の 2 つを追加 ||[0 1 1 2 3 5 8 13 21 34 55 89]||))) ||[0 1 1 2 3 5 8 13 21 34 55 89]||))

;; すべてをまとめる (add-to fibsq ||[0 1]||)|| => [0 1 1 2 3 5 8 13 21 34 55 89]||

(println [x (add-to-fibsq ||[0 1]||) :when (even? x)])|| => java.lang.RuntimeException: シンボルを解決できません: x このコンテキストではコンパイル中:(NO_SOURCE_PATH:19:2)||

これはリスト内包表記の仕組みではありませんか?

4

1 に答える 1

4

Clojure には、最後の行で使用しようとしているようなスタンドアロンのリスト内包表記はありません。for最後の式の最初に を呼び出す必要があります。

(println (for [x (add-to-fibsq fibsq) :when (even? x)] x))

forを呼び出した結果のエントリごとに値を x にバインドする関数です(add-to-fibsq fibsq)。このコンテキストでforは、必要以上のものでもあります

(println (filter even? (add-to-fibsq fibsq)))
于 2012-06-26T15:45:38.757 に答える