2014-01-21 2 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

Ahh, мне не хватало [] при попытке 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=>