我正在研究一个Rails模板,并试图编写一些代码,允许我在多个列中填充一个或多个ul标签“从上到下”和“从左到右”的列我指定。我刚刚得到了Ruby的诀窍,所以我无法弄清楚这一点。我也很好奇这个有用的片段的惯用Haskell版本。改进Clojure的版本加赞赏:你会如何在Ruby和/或Haskell中编写这个Clojure代码片段?
(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)))))
随着该位的代码,然后我可以做到以下几点:
(table (range 10) :cols 3)
打印出来,这会看起来像这样:
0 1 2
3 4 5
6 7 8
9
而棘手一个:
(table (range 10) :cols 3 :direction 'down)
看起来像这样:
0 4 8
1 5 9
2 6
3 7
三样东西,你也许可以改变Clojure的版本 1 。使用defnk(clojure.contrib.def)它有点好看。 2.关键字而不是符号 3.而不是做转换为向量两种方式统一它与(vec(地图vec(condp .....))) – nickik 2011-04-19 14:34:59