Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在clojure中将符号作为函数传递_Clojure - Fatal编程技术网

在clojure中将符号作为函数传递

在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

我正在学习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)))
我的问题是:有没有办法将comparator方法作为符号名传递给函数,并使其按asc或desc顺序进行相应排序?我的意思是:

(defn get-sorted-mtimes [dir <sym>]  
  (loop [sm (sorted-map-by <sym>)
       ...

如果未使用(comparator)函数,则会出现java.lang.ClassCastException异常。

与Clojure中的其他函数一样。所以没有什么可以阻止你把它作为一个论点

事实上,我要说的是,这样做是很好的Clojure风格。Clojure本质上是一种函数式编程语言,因此在适当的地方使用它并没有错

其他一些小建议:

  • 使用
    comparator
    代替
    作为函数参数的名称。我认为这更具描述性,也更符合Clojure的正常命名约定
  • 您还可以添加另一个函数参数来确定要比较的内容,以便可以传递函数,如
    get mtime
    (返回文件的mtime的简单函数)
  • 我建议将一系列文件作为函数的输入,而不是目录。这样,您的函数就更通用了,可以用完全相同的方式删除递归目录扫描之类的内容
  • 我建议使用
    (进入sm lst)
    ——比大循环/if/recur构造简单得多

然后你可以做一些非常好的事情,比如
(获取排序文件(列表文件递归目录)>获取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)))