我有以下代码:
(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)这行代码似乎不起作用。在我的输出中,我希望通过文件夹结构向下移动,但它似乎停留在第一级。
我猜我犯了一些愚蠢的错误,但我现在花了几个小时在上面,似乎没有接近解决方案。
发布于 2013-03-31 12:42:54
正如@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)
)))发布于 2013-03-31 06:52:31
map是懒惰的,将它包装在doall中以强制求值,就像这样:(doall (map remove-folder children))。
发布于 2013-04-02 11:37:24
为什么你不内联子代并去掉def呢?看起来您并不想在当前的名称空间中创建全局绑定。你无意中引入了副作用。
函数名remove-folder并没有告诉我们函数应该做什么。参数名称文件不描述可以预期的参数类型。但我知道这是一种探索性的代码。
干杯-
https://stackoverflow.com/questions/15724004
复制相似问题