2014-01-21 37 views
2

我在Clojure中搞乱了Noir网络框架,并试图生成一个随机的网格。在clojure中反复获取随机元素

这可能是很糟糕的代码,但我正在学习! :d

(def tiles [:stairs :stone :monster]) 

(defpage "/" [] 
    (common/layout 
     [:div {:class "level"} 
     (repeatedly 10 [:div {:class "row"} 
      (repeatedly 10 
      [:div {:class (str "tile " (name (rand-nth tiles)))}])])])) 

但是这个代码是抛出一个异常:

Wrong number of args (0) passed to: PersistentVector - (class clojure.lang.ArityException) 

回答

5

repeatedly接受一个函数不是一个身体,所以你需要包裹尸体的功能:

(repeatedly 10 (fn [] 
       [:div 
       {:class "row"} 
       (repeatedly 10 (fn [] 
            [:div {:class (str "tile " (name (rand-nth tiles)))}]))])) 
+1

啊,我错过了[]之前尝试fn。我必须说我希望Clojure/Noir以更漂亮的方式处理这个问题:>谢谢! –

+0

@KristjanOddsson,没问题!实际上,我发现Clojure不会在这里变得太聪明(正如它通常不会),你只是将函数传递给函数。 – ponzao

4

答:

user=> (repeatedly 10 (fn [] [:div])) 
([:div] [:div] [:div] [:div] [:div] [:div] [:div] [:div] [:div] [:div]) 


user=> (repeatedly 10 [:div])  
ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity (AFn.java:437) 


user=> (doc repeatedly) 
------------------------- 
clojure.core/repeatedly 
([f] [n f]) 
    Takes a function of no args, presumably with side effects, and 
    returns an infinite (or length n if supplied) lazy sequence of calls 
    to it 
nil 
user=>