Clojure,console:println输出并不总是可见的

时间:2014-11-18 16:54:32

标签: clojure console output println

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))

1 个答案:

答案 0 :(得分:1)

可能是懒惰序列的问题:你构建一个永远不会实现的懒惰seq,因此代码永远不会执行。尝试在doall

的结果上调用traverse-dir
(doall (concat (map dir-handler dirs) (map file-handler files))))