Это не идиоматический запуск сценариев Clojure снова и снова из командной строки. REPL - лучшая командная строка. Clojure, являющийся Lisp, обычно запускает Clojure и оставляет тот же экземпляр, который работает вечно, и взаимодействует с ним, а не перезапускает его. Вы можете изменять функции в исполняемом экземпляре по одному, запускать их и выталкивать их по мере необходимости. Исключение утомительного и медленного традиционного цикла редактирования/компиляции/отладки - отличная особенность Lisps.
Вы можете легко писать функции, чтобы делать такие вещи, как выполнять модульные тесты, и просто вызывать эти функции из REPL, когда вы хотите их запустить, и игнорировать их в противном случае. В Clojure обычно используется clojure.contrib.test-is
, добавьте свои тестовые функции в пространство имен, затем используйте clojure.contrib.test-is/run-tests
, чтобы запустить их все.
Еще одна веская причина не запускать Clojure из командной строки в том, что время запуска JVM может быть непомерно высоким.
Если вы действительно хотите запустить скрипт Clojure из командной строки, существует множество способов сделать это. См. the Clojure mailing list для обсуждения.
Один из способов - проверить наличие аргументов командной строки. Учитывая это 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.
Я не думаю, что * Особенности * хороши для этого. * функции * показывают доступные функции, а не какое-либо состояние среды или запрос на запуск кода. –
почему бы и нет? * особенности *, используемые для всех видов вещей: для описания аппаратного обеспечения, на котором работают, некоторые основные доступные библиотеки, некоторые режимы работы программного обеспечения, версия реализации Lisp, версия языка, будь то: mode или: режим разработки и т. д. –