SUBJ。有一个工作程序,它基本上递归地复制文件系统树。不知何故,来自递归函数内部的println不会显示任何输出。
构建相册调用 traverse-dir ;我可以看到" 10"在控制台中,但从来没有任何" 11" s - 应该是很多。 (println" 11")不可能错过执行路径,因为文件被真正复制(上面一行)。这不是很好,因为该项目是一个控制台应用程序,向用户报告每个复制的文件,以免他应该怀疑冻结。这不是开玩笑,因为该应用程序旨在将相册上传到手机。
(defn traverse-dir
"Traverses the (source) directory, preorder"
[src-dir dst-step]
(let [{:keys [options arguments]} *parsed-args*
dst-root (arguments 1)
[dirs files] (list-dir-groomed (fs/list-dir src-dir))
dir-handler (fn [dir-obj]
"Processes the current directory, source side;
creates properly named directory destination side, if necessary"
(let [dir (.getPath dir-obj)
step (str dst-step *nix-sep* (fs/base-name dir-obj))]
(fs/mkdir (str dst-root step))
(traverse-dir dir step)))
file-handler (fn [file-obj]
"Copies the current file, properly named and tagged"
(let [dst-path (str dst-root dst-step *nix-sep* (.getName file-obj))]
(fs/copy file-obj (fs/file dst-path))
(println "11")
dst-path))]
(concat (map dir-handler dirs) (map file-handler files))))
(defn build-album
"Copy source files to destination according
to command line options"
[]
(let [{:keys [options arguments]} *parsed-args*
output (traverse-dir (arguments 0) "")]
(println "10")
output))
答案 0 :(得分:1)
可能是懒惰序列的问题:你构建一个永远不会实现的懒惰seq,因此代码永远不会执行。尝试在doall
:
traverse-dir
(doall (concat (map dir-handler dirs) (map file-handler files))))