Функция Clojure не записывает вывод в файл при вызове из -main - PullRequest
1 голос
/ 26 декабря 2011

Итак, у меня есть следующая функция, которая хорошо работает при вызове из REPL:

(defn plot-data-files
  "Produces a file with x-axis values on 1st column and y-axis values on the
  2nd column"
  []
  (let [filename (user-input "file to which you want to write plot output")
        x-values file-data-days
        y-values (get-dndtf)
        file-writer (new java.io.FileWriter filename)]
    (if (= (first y-values) za-not-found)
      (println za-not-found)
      (for [index (range (count x-values))]
        (binding [*out* file-writer]
          (prn (Double/parseDouble (str (nth x-values index)))
               (Double/parseDouble (str (nth y-values index)))))))))

Однако, когда я пытаюсь использовать Leinigen для создания файла JAR, функция больше не записывает в файлы.Поэтому я попытался вызвать -main из REPL, и, конечно же, функция также не записывает в файлы, даже если это происходит при ее вызове.Итак, я попытался определить другую функцию:

(defn call-plot-function
  "Basically calls the plot function, plot-data-files"
  [] (plot-data-files))

и, конечно же, она работает.Я пытаюсь вызвать -main снова, но на этот раз вызов call-plot-function вместо plot-data-files напрямую:

(defn -main [& args]
  (get-all-file-data)
  (while (not (= \n (first (user-input "whether you want to output more plot
  files"))))
    (call-plot-function)))

И снова, plot-data-files магическим образом не записывает вывод файла при вызове -main.Что мне здесь делать?

1 Ответ

6 голосов
/ 26 декабря 2011

for не является циклом.Ваш -main возвращает ленивую последовательность, и вы никогда не форсируете ни один из ее элементов.Repl заставляет печатать, поэтому вы видите разницу.Если вы хотите получить побочные эффекты вместо последовательности, doseq имеет и ту же семантику, что и for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...