调用map-function似乎没有做任何事情

时间:2013-03-30 22:05:26

标签: clojure

我有以下代码:

(defn remove-folder [file]
   (do
      (println "Called with file " (.getName file))
      (if (.isDirectory file) 
          (do
           (println (.getName file) " is directory")
           (def children (.listFiles file))
           (println "Number of children " (count children))
           (map remove-folder children)
           (delete-file file)))
          (do
           (println (.getName file) " is file")
           (delete-file file)
          )))

我的问题是该行(map remove-folder children)似乎不起作用。在我的输出中,我希望通过文件夹结构向下移动,但它似乎保持在第一级。

我猜我已经犯了一些愚蠢的错误,但我现在花了几个小时才开始,似乎没有找到解决方案。

3 个答案:

答案 0 :(得分:3)

map是懒惰的,将其包装在doall中以强制评估,如下所示:(doall (map remove-folder children))

答案 1 :(得分:2)

正如@ponzao所说,map是懒惰的。

但无论如何,我认为使用map只是为了获得副作用并“删除”结果并不是一个好主意。就个人而言,我会使用doseq代替,因为它提示我期待副作用。

(defn remove-folder [file]
   (do
      (println "Called with file " (.getName file))
      (if (.isDirectory file) 
          (do
           (println (.getName file) " is directory")
           (def children (.listFiles file))
           (println "Number of children " (count children))
           (doseq [c children]
             (remove-folder c))
           (delete-file file)))
          (do
           (println (.getName file) " is file")
           (delete-file file)
          )))

答案 2 :(得分:0)

为什么不内联儿童并摆脱 def ?您似乎不想在当前命名空间中创建全局绑定。你无意中引入了副作用。

函数名称 remove-folder 不会告诉我们该函数应该做什么。参数名称文件不描述可以预期的参数类型。但我明白这是一种探索性的代码。

干杯 -