【发布时间】:2011-02-18 15:57:13
【问题描述】:
我正在编写一个 Rails 模板,并试图编写一些代码,让我可以填充一个表格或多列 ul 标记“从上到下”和“从左到右”跨越许多我指定的列。我刚刚掌握了Ruby的窍门,所以我无法弄清楚。我也很好奇这个有用的 sn-p 的惯用 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 (map vec (condp .....))) 统一起来
标签: ruby haskell clojure language-comparisons