2014-11-18 3 views
0

Subj. Есть рабочая программа, которая рекурсивно копирует деревья файловой системы. Каким-то образом println изнутри рекурсивной функции не будет выводить никакого вывода.Clojure, консоль: вывод println не всегда отображается

строительный альбом звонки traverse-dir; Я вижу «10» в консоли, но никогда никаких «11» - их не должно быть много. (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

Используете ли вы результат наращивания альбома в любом месте? Или вы называете это и игнорируете результат? – noisesmith

ответ

1

Может быть проблема с отложенными последовательностями: вы строите ленивым SEQ который никогда не реализуется, и, таким образом, код не выполняет. Попробуйте вызвать doall на результате traverse-dir:

(doall (concat (map dir-handler dirs) (map file-handler files)))) 
+0

Спасибо, Никита! Это точно. Мне не нужно беспокоиться о проблемах с производительностью в моем случае, не так ли? –

+0

@AlexeyOrlov Я считаю, что производительность в порядке. Вы можете поэкспериментировать, заменив карту pmap для параллельного выполнения. Может быть быстрее для больших каталогов. –

Смежные вопросы