2012-06-26 33 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)))