Нет смысла запускать сценарии Clojure снова и снова из командной строки. REPL - лучшая командная строка. Clojure - это Лисп, обычно запускают Clojure и оставляют один и тот же экземпляр работать вечно, взаимодействуя с ним, а не перезапуская его. Вы можете изменять функции в запущенном экземпляре по одной, запускать их и тыкать их по мере необходимости. Выход из утомительного и медленного традиционного цикла редактирования / компиляции / отладки - отличная особенность Лиспса.
Вы можете легко написать функции для выполнения таких вещей, как запуск модульных тестов, и просто вызывать эти функции из REPL всякий раз, когда вы хотите запустить их, и игнорировать их в противном случае. В Clojure принято использовать clojure.contrib.test-is
, добавить тестовые функции в пространство имен, а затем использовать clojure.contrib.test-is/run-tests
, чтобы запустить их все.
Еще одна веская причина не запускать Clojure из командной строки в том, что время запуска JVM может быть непомерно большим.
Если вы действительно хотите запустить скрипт Clojure из командной строки, есть несколько способов сделать это. См. список рассылки Clojure для обсуждения.
Один из способов - проверить наличие аргументов командной строки. Учитывая это foo.clj
в текущем каталоге:
(ns foo)
(defn hello [x] (println "Hello," x))
(if *command-line-args*
(hello "command line")
(hello "REPL"))
Вы получите различное поведение в зависимости от того, как вы запустите Clojure.
$ java -cp ~/path/to/clojure.jar:. clojure.main foo.clj --
Hello, command line
$ java -cp ~/path/to/clojure.jar:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (use 'foo)
Hello, REPL
nil
user=>
См. src/clj/clojure/main.clj
в источнике Clojure, если вы хотите увидеть, как это работает.
Другой способ - скомпилировать ваш код в .class
файлы и вызывать их из командной строки Java. Учитывая исходный файл foo.clj
:
(ns foo
(:gen-class))
(defn hello [x] (println "Hello," x))
(defn -main [] (hello "command line"))
Создать каталог для хранения скомпилированных .class
файлов; по умолчанию ./classes
. Вы должны создать эту папку самостоятельно, Clojure не создаст ее. Также убедитесь, что вы установили $CLASSPATH
для включения ./classes
и каталог с вашим исходным кодом; Я предполагаю, что foo.clj
находится в текущем каталоге. Итак, из командной строки:
$ mkdir classes
$ java -cp ~/path/to/clojure.jar:./classes:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (compile 'foo)
foo
В каталоге classes
теперь у вас будет куча .class
файлов. Чтобы вызвать ваш код из командной строки (по умолчанию работает функция -main
):
$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.
Существует много информации о компиляции кода Clojure на clojure.org .