2012-10-29 11 views
6

Jestem w trakcie uczenia się clojure po pracy i robię to, robiąc małą grę (kochającą bibliotekę quil), aby zapoznać mnie z różnymi aspektami clojure w konkretnym i FP ogólnie.Czy możesz przekazać dane do następnej iteracji w (dla ...)?

Tak więc, mój świat gry istnieje w postaci 3d siatki struktur danych mapy (wektor wektora mapy). Chcę iterować po każdym punkcie w przestrzeni 3d (mapa) i zmieniać dane po spełnieniu warunku. To było moje pierwsze rozwiązanie:

(struktura danych gry jest stan gry (mapa))

(defn soil-gen [game] 
    (let [world-x (game :world-x) 
     world-y (game :world-y) 
    world-z (game :world-z)] 
     (for [x (range world-x) 
      y (range world-y) 
      z (range world-z) 
      :when (> z (* world-z (rand)))] 
     (assoc-in game [:world x y z :type] :soil)))) 

Ale to zwraca listę wyników (moja gra struktury dane państwo) każdej iteracji zamiast jednej struktury danych gry. Powinienem jakoś przekazać wynik każdej iteracji z powrotem do. Coś jak pętla/recur prawdopodobnie, ale myślę, że nie możesz połączyć recur z dla.

Czy ktoś jest wskazówką?

dzięki

Odpowiedz

8

Co możesz zrobić, to użyć reduce z for jak pokazano poniżej:

(defn soil-gen [game] 
    (let [world-x (game :world-x) 
     world-y (game :world-y) 
    world-z (game :world-z)] 

    (reduce (fn [g [x y z]] (assoc-in g [:world x y z :type] :soil))) 
      game 
      (for [x (range world-x) 
        y (range world-y) 
        z (range world-z) 
       :when (> z (* world-z (rand)))] 
       [x y z])))) 
+0

Czy dokładnie to, czego chcę, dzięki – user1782011

2

Prawdopodobnie chcesz użyć czegoś podobnego reduce przekazać skumulowany wynik między każdej iteracji.

uproszczone przykłady:

(reduce 
    (fn [m val] (assoc m val (str "foo" val))) 
    {}    ;; initial value for m 
    (range 5))  ;; seqence of items to reduce over 

=> {4 "foo4", 3 "foo3", 2 "foo2", 1 "foo1", 0 "foo0"} 

reduce jest na ogół bardzo użyteczne, kiedy to pewne pojęcie „całkowitej wartości” w programowaniu funkcjonalnych. Ma także tę zaletę, że jest bardzo wydajny.

+0

dzięki za dodatkowe informacje na temat zmniejszenia. – user1782011

Powiązane problemy