2012-06-26 31 views
1

爲什麼我的println(例子的最後一行)就像列表理解一樣?我想下面的代碼來獲得Clojure中解決項目歐拉問題#2:爲什麼列表println的行爲不像列表理解?

(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)]) 

輸出我得到的是以下幾點:

(DEF || [0 1] | | [0 1])

(defn倒數第二個[|| [0 1 1 2 3 5 8 13 21 34 55 89] ||](nth || [0 1 1 2 3 5 8 1313 34 55 89] ||( - (count || [0 1 1 2 3 5 8 13 21 34 55 89] ||)2)))

(se cond-to-last || [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] ||)(倒數第二個|| [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) (add- to-fibsq(conj || [0 1 1 2 3 5 8 13 21 34 55 89] ||(add-last-two || [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)||

這不是列表解析的工作原理嗎?

+0

我沒有立即訪問Project Euler。你可以編輯你的問題,包括一個你想要解決的問題的簡短陳述嗎? TNX – octopusgrabbus

回答

4

Clojure沒有獨立的list-comprehensions,就像你試圖在最後一行使用的那樣。您需要在最後一個表達式開始時撥打電話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)))