Właśnie zacząłem w / Clojure (pochodzący z Rubiego) i chciałbym zbudować małą aplikację z interfejsem wiersza poleceń. Jak obsłużyć wejście / wyjście do CL?
Zauważyłem, że istnieje clojure.contrib.command-line, ale dokumentacja jest niewielka.
clojure
clojure-contrib
dMix
źródło
źródło
Odpowiedzi:
Oto przykład użycia jego
with-command-line
makra. Poniższy kod określa trywialną klasę z główną metodą, która nic nie robi, ale wyświetla wartości jej argumentów wiersza poleceń.(ns cmd-line-demo (:gen-class) (:use clojure.contrib.command-line)) (defn -main [& args] (with-command-line args "Command line demo" [[foo "This is the description for foo" 1] [bar "This is the description for bar" 2] [boolean? b? "This is a boolean flag."] remaining] (println "foo: " foo) (println "bar: " bar) (println "boolean?: " boolean?) (println "remaining: " remaining)))
Skompiluj klasę na REPL:
user> (compile 'cmd-line-demo) cmd-line-demo
Przykładowe użycie
1) Wykonywanie bez argumentów wiersza poleceń spowoduje wyświetlenie informacji pomocy. Informacje pomocy mogą być również wyświetlane z flagami
--help
lub-h
. Zauważ, że informacje pomocy są generowane automatycznie na podstawie twojego cmdspec.$ java -classpath . cmd_line_demo Command line demo Options --foo <arg> This is the description for foo [default 1] --bar <arg> This is the description for bar [default 2] --boolean, -b This is a boolean flag.
2) Nieokreślone argumenty otrzymują wartość domyślną określoną w powiązaniu cmdspec. Na przykład
bar
ma domyślną wartość2
.$ java -classpath . cmd_line_demo --foo "changed value" foo: changed value bar: 2 boolean?: nil remaining: []
3) Flagi logiczne są oznaczone sufiksem „?” w cmdspec. Zauważ, że sama flaga nie zawiera znaku „?” jako część jego nazwy.
$ java -classpath . cmd_line_demo -boolean foo: 1 bar: 2 boolean?: true remaining: []
4) Zauważ również, że możesz określić aliasy flag, określając wiele symboli w cmdspec. Zrobiłem to za pomocą flag
boolean?
ib?
.5) Na koniec określiłem, że
remaining
przechwytuje wszystkie pozostałe argumenty bez powiązanych flag.$ java -classpath . cmd_line_demo -foo test file1 file2 file3 foo: test bar: 2 boolean?: nil remaining: [file1 file2 file3]
źródło
Stara linia clojure.contrib.command została zastąpiona przez tools.cli.
https://github.com/clojure/tools.cli
tools.cli nosiło nazwę clargon. Poniżej znajdują się dwa posty na blogu, które zawierają przykłady użycia tools.cli (po prostu zastąp wszelkie odniesienia do clargon na tools.cli. Posty są nieaktualne).
Pokazuje kilka metod, w tym starą linię clojure.contrib.command
Post skupiający się na Clargon autorstwa oryginalnego autora
źródło
Dodam, że dasz radę
(apply -main *command-line-args*)
poniżej,
(defn -main ...)
aby działał w trybie interpretowanym.źródło
Długo po zadaniu pytania mogę zasugerować użycie
docopt
bibliotek do budowy interfejsu CLI. Jest jeden dla Clojure -docopt.clj
Możesz więc zadeklarować swój interfejs i udokumentować go w tym samym czasie - to niesamowite i łatwe do zrobienia.
Aby uzyskać więcej informacji, polecam sprawdzić http://docopt.org/
Dostępna jest również aplikacja online do sprawdzania interfejsu http://try.docopt.org/
I wreszcie mój przykład, w jaki sposób można użyć biblioteki Clojure.
źródło
Może spróbuj Jarka. Jark to narzędzie do uruchamiania programów clojure na trwałej maszynie JVM. Ma kilka przydatnych narzędzi wiersza poleceń.
https://clojars.org/jark
źródło