запуск lein завершается без запуска всей моей основной функции

#clojure #leiningen

#clojure #leiningen

Вопрос:

Вот мой project.clj :

 (defproject fixurls "0.1.0-SNAPSHOT"
    :description "Fixurls"
    :url "https://github.com/swizzard/fixurls"
    :license {:name "WTFPL"
                :url "http://www.wtfpl.net/"}
    :dependencies [[org.clojure/clojure "1.5.1"]
              [clj-http "0.9.2"]
              [org.clojure/data.json "0.2.4"]
              [me.raynes/fs "1.4.4"]
              ]
    :plugins [[lein-gorilla "0.2.0"]]
    :jvm-opts ["-Xmx4g" "-Xms2g" "-Xss1g" "-server"]
    :main ^:skip-aot fixurls.core
)
  

Вот ~/clojure-stuff/fixurls/src/core.clj :

 (ns fixurls.core
    (:require
    [clj-http.client :as client]
    [clojure.string :as string]
    [clojure.java.io :as io]
    [me.raynes.fs :as fs]
    [clojure.data.json :as json]
    )
    (:import [java.net URL])
    (:gen-class)
)
...
(defn process-file [in-file] (spit (get-fixed-name in-file)
                          (update-file in-file)))

(defn process-files [] (map process-file valid-files))

(defn -main [] (do (println "Hello, world!") (process-files)))
  

Когда я запускаю lein run , все, что происходит после паузы, — это печать Hello, world! to stdout , а затем выход lein. Я независимо проверил, что (process-files) часть -main не вызывается. Я могу запускать (-main) из repl, и он работает правильно. Что я делаю не так?

Ответ №1:

map Функция является ленивой и не гарантирует обработку любого ввода, если не будет получен доступ к соответствующему выводу. Если вы используете map только для побочных эффектов, завершите его dorun . Если вам также нужен результат, используйте doall для принудительной обработки всего ввода.

Комментарии:

1. Это сработало. Спасибо! Думаю, мне все еще нужно разобраться с ленью…