Non è idiota eseguire gli script Clojure più e più volte dalla riga di comando. Il REPL è una linea di comando migliore. Clojure essendo un Lisp, è comune lanciare Clojure e lasciare la stessa istanza in esecuzione per sempre, e interagire con essa piuttosto che riavviarla. È possibile modificare le funzioni nell'istanza in esecuzione una alla volta, eseguirle e inserirle secondo necessità. Sfuggire al noioso e lento ciclo di modifica/compilazione/debug tradizionale è una grande funzionalità di Lisps.
È possibile scrivere facilmente le funzioni per eseguire operazioni come i test delle unità di corsa e richiamare tali funzioni dal REPL ogni volta che si desidera eseguirle e ignorarle altrimenti. È comune in Clojure utilizzare clojure.contrib.test-is
, aggiungere le funzioni di test al proprio spazio dei nomi, quindi utilizzare clojure.contrib.test-is/run-tests
per eseguirle tutte.
Un altro buon motivo per non eseguire Clojure dalla riga di comando è che il tempo di avvio della JVM può essere proibitivo.
Se si desidera eseguire uno script Clojure dalla riga di comando, ci sono molti modi in cui è possibile farlo. Vedi the Clojure mailing list per qualche discussione.
Un modo è verificare la presenza di argomenti della riga di comando. Dato questo foo.clj
nella directory corrente:
(ns foo)
(defn hello [x] (println "Hello," x))
(if *command-line-args*
(hello "command line")
(hello "REPL"))
Otterrete un comportamento diverso a seconda di come si inizia 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=>
Vedi src/clj/clojure/main.clj
nella fonte Clojure se si vuole vedere come questo funziona.
Un altro modo è compilare il codice nei file .class
e richiamarli dalla riga di comando di Java. Dato un file sorgente foo.clj
:
(ns foo
(:gen-class))
(defn hello [x] (println "Hello," x))
(defn -main [] (hello "command line"))
Creare una directory per memorizzare i file compilati .class
; questo valore predefinito è ./classes
. Devi creare questa cartella da solo, Clojure non la creerà. Assicurati inoltre di impostare $CLASSPATH
per includere ./classes
e la directory con il tuo codice sorgente; Immagino che foo.clj
sia nella directory corrente. Così dalla riga di comando:
$ mkdir classes
$ java -cp ~/path/to/clojure.jar:./classes:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (compile 'foo)
foo
Nella directory classes
si avranno ora un gruppo di .class
file.Per richiamare il codice dalla riga di comando (in esecuzione della funzione -main
per impostazione predefinita):
$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.
C'è un sacco di informazioni sulla compilazione del codice Clojure su clojure.org.
Non penso che * le caratteristiche * siano adatte a questo. * caratteristiche * mostra le funzionalità disponibili, non alcuni stati dell'ambiente o richieste di esecuzione del codice. –
perché no? * caratteristiche * utilizzate per tutti i tipi di cose: per descrivere l'hardware su cui è in esecuzione la cosa, alcune librerie core disponibili, alcune modalità del software, la versione dell'implementazione Lisp, la versione della lingua, se è: produzione- mode o: development-mode, ecc. –