在clojure中将符号作为函数传递
我正在学习clojure,我编写了一个小函数,给定一个目录路径名,它会根据文件的MTIME以降序返回一个已排序的文件映射。这是:在clojure中将符号作为函数传递,clojure,Clojure,我正在学习clojure,我编写了一个小函数,给定一个目录路径名,它会根据文件的MTIME以降序返回一个已排序的文件映射。这是: (defn get-sorted-mtimes [dir] (loop [sm (sorted-map-by >) lst (for [f (.listFiles (File. dir))] (let [k (.lastModified f) v (.get
(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)))
我的问题是:有没有办法将comparator方法作为符号名传递给函数,并使其按asc或desc顺序进行相应排序?我的意思是:
(defn get-sorted-mtimes [dir <sym>]
(loop [sm (sorted-map-by <sym>)
...
如果未使用(comparator)函数,则会出现java.lang.ClassCastException异常。
与Clojure中的其他函数一样。所以没有什么可以阻止你把它作为一个论点
事实上,我要说的是,这样做是很好的Clojure风格。Clojure本质上是一种函数式编程语言,因此在适当的地方使用它并没有错
其他一些小建议:
- 使用
代替comparator
作为函数参数的名称。我认为这更具描述性,也更符合Clojure的正常命名约定 - 您还可以添加另一个函数参数来确定要比较的内容,以便可以传递函数,如
(返回文件的mtime的简单函数)李>get mtime
- 我建议将一系列文件作为函数的输入,而不是目录。这样,您的函数就更通用了,可以用完全相同的方式删除递归目录扫描之类的内容
- 我建议使用
——比大循环/if/recur构造简单得多李>(进入sm lst)
然后你可以做一些非常好的事情,比如
(获取排序文件(列表文件递归目录)>获取mtime)
-或者你能想到的任何类似的组合 我不完全确定是什么,但如果它只是一个函数,它应该完全按照您的建议工作…我使用了作为要使用的符号的占位符我知道我可以传递符号>作为任何其他clojure函数,-也就是说,如果符号硬编码到我的函数体中。我想做的是传递一个“>”或“我刚刚明白了你的意思。通过使用(比较器…)而不是(符号…)它工作得很好。谢谢!为什么要将“>”作为字符串传递?我只想直接将函数作为>传递,例如(get sorted mtimes dir>)…还是我遗漏了什么?好的,太好了!顺便说一句,我想你甚至不需要(比较器…)位。
(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)))