Ich arbeitete an einer Rails-Vorlage und versuchte, ein wenig Code zu schreiben, der es mir erlaubt, eine Tabelle oder mehrere Spalten von UL-Tags "von oben nach unten" und "von links nach rechts" über viele Spalten hinweg zu füllen Ich spezifiziere. Ich bekomme gerade Ruby in den Griff, damit ich das nicht herausfinden kann. Ich bin auch neugierig auf eine idiomatische Haskell-Version für dieses nützliche Snippet. Improvements to Clojure Version geschätzt:Wie würden Sie dieses Clojure-Snippet in Ruby und/oder Haskell schreiben?
(defn table [xs & {:keys [cols direction]
:or {cols 1 direction 'right}}]
(into []
(condp = direction
'down (let [c (count xs)
q (int (/ c cols))
n (if (> (mod c q) 0) (inc q) q)]
(apply map vector (partition n n (repeat nil) xs)))
'right (map vec (partition cols cols (repeat nil) xs)))))
Mit diesem Stück Code kann ich dann folgendes tun:
(table (range 10) :cols 3)
Gedruckt heraus dies wie so aussehen:
0 1 2
3 4 5
6 7 8
9
Und die trickier eins:
(table (range 10) :cols 3 :direction 'down)
Sieht so aus:
0 4 8
1 5 9
2 6
3 7
Drei Dinge, die Sie vielleicht auf der clojure Version ändern könnte 1 Benutze defnk (clojure.contrib.def) es ist ein wenig nett zu lesen. 2. Schlüsselwörter anstelle von Symbolen 3. Anstatt die Konvertierung in Vektoren zu machen, vereinheitlichen Sie sie mit (vec (map vec (condp .....))) – nickik