首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对map-function的调用似乎没有做任何事情

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

Stack Overflow用户
提问于 2013-03-31 06:05:26
回答 3查看 84关注 0票数 0

我有以下代码:

代码语言:javascript
运行
复制
(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)这行代码似乎不起作用。在我的输出中,我希望通过文件夹结构向下移动,但它似乎停留在第一级。

我猜我犯了一些愚蠢的错误,但我现在花了几个小时在上面,似乎没有接近解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-31 12:42:54

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

但不管怎样,我不认为仅仅为了获得副作用和“丢弃”结果而使用map是一个好主意。就我个人而言,我会使用doseq,因为它给出了一个暗示,我预计会有副作用。

代码语言:javascript
运行
复制
(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
EN

Stack Overflow用户

发布于 2013-03-31 06:52:31

map是懒惰的,将它包装在doall中以强制求值,就像这样:(doall (map remove-folder children))

票数 3
EN

Stack Overflow用户

发布于 2013-04-02 11:37:24

为什么你不内联子代并去掉def呢?看起来您并不想在当前的名称空间中创建全局绑定。你无意中引入了副作用。

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

干杯-

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15724004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档