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.
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.
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
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?
i b?
.
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]
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
Długo po zadaniu pytania mogę zasugerować użycie docopt
bibliotek do budowy interfejsu CLI. Jest jeden dla Clojure -docopt.clj
docopt jest oparty na konwencjach używanych od dziesięcioleci w komunikatach pomocy i stronach podręcznika do opisu interfejsu programu. Opis interfejsu w docopt to taka pomoc, ale sformalizowana
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.
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ń.
jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args