【发布时间】:2011-06-02 22:54:04
【问题描述】:
我正在学习 clojure,并且我编写了一个小函数,它给定目录路径名,根据文件的 mtime 降序返回文件的排序映射。这里是:
(defn get-sorted-mtimes [dir]
(loop [sm (sorted-map-by >)
lst (for [f (.listFiles (File. dir))]
(let [k (.lastModified f)
v (.getName f)]
[k v]))]
(if (seq lst)
(recur (assoc sm ((first lst) 0) ((first lst) 1))
(rest lst))
sm)))
我的问题是:有没有办法将比较器方法作为符号名称传递给函数,并相应地按 asc 或 desc 顺序排序?我的意思是:
(defn get-sorted-mtimes [dir <sym>]
(loop [sm (sorted-map-by <sym>)
...
另外,有没有更符合 clojuresque 的方式来完成这项任务?
好吧,为了记录,这是函数的最终形式,它完全符合我的需要:
(defn get-sorted-mtimes [dir comp]
(loop [sm (sorted-map-by (comparator comp))
lst (for [f (.listFiles (File. dir))]
(let [k (.lastModified f)
v (.getName f)]
[k v]))]
(if (seq lst)
(recur (assoc sm ((first lst) 0) ((first lst) 1))
(rest lst))
sm)))
如果不使用(比较器)函数,则会得到 java.lang.ClassCastException 异常。
【问题讨论】:
-
我不完全确定
是什么,但如果它只是一个函数,它应该完全按照你的建议工作...... -
我使用
作为要使用的符号的占位符
标签: clojure