我有以下代码:
(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)似乎不起作用。在我的输出中,我希望通过文件夹结构向下移动,但它似乎保持在第一级。
我猜我已经犯了一些愚蠢的错误,但我现在花了几个小时才开始,似乎没有找到解决方案。
答案 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 不会告诉我们该函数应该做什么。参数名称文件不描述可以预期的参数类型。但我明白这是一种探索性的代码。
干杯 -