Ich habe gerade mit Clojure (von Ruby) angefangen und möchte eine kleine App mit einer Befehlszeilenschnittstelle erstellen. Wie gehe ich mit der Eingabe / Ausgabe in einen CL um?
Ich habe festgestellt, dass es eine clojure.contrib.command-Zeile gibt, aber die Dokumentation ist schmal.
clojure
clojure-contrib
dMix
quelle
quelle
Antworten:
Hier ist ein Beispiel für die Verwendung des
with-command-line
Makros. Der folgende Code gibt eine triviale Klasse mit einer Hauptmethode an, die nichts anderes tut, als die Werte ihrer Befehlszeilenargumente auszudrucken.(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)))
Kompilieren Sie die Klasse in der REPL:
user> (compile 'cmd-line-demo) cmd-line-demo
Anwendungsbeispiel
1) Wenn Sie keine Befehlszeilenargumente ausführen, werden die Hilfeinformationen angezeigt. Die Hilfeinformationen können auch mit
--help
oder-h
Flags angezeigt werden. Beachten Sie, dass die Hilfeinformationen automatisch aus Ihrer cmdspec generiert werden.$ 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) Nicht angegebene Argumente erhalten den in der cmdspec-Bindung angegebenen Standardwert. Hat beispielsweise
bar
einen Standardwert von2
.$ java -classpath . cmd_line_demo --foo "changed value" foo: changed value bar: 2 boolean?: nil remaining: []
3) Boolesche Flags werden mit dem Suffix "?" in der cmdspec. Beachten Sie, dass die Flagge selbst nicht nicht enthalten das „?“ als Teil seines Namens.
$ java -classpath . cmd_line_demo -boolean foo: 1 bar: 2 boolean?: true remaining: []
4) Beachten Sie auch, dass Sie Flag-Aliase angeben können, indem Sie mehrere Symbole in der cmdspec angeben. Ich habe das mit den
boolean?
undb?
Flags gemacht.5) Schließlich habe ich angegeben, dass
remaining
alle verbleibenden Argumente ohne zugehörige Flags erfasst werden.$ java -classpath . cmd_line_demo -foo test file1 file2 file3 foo: test bar: 2 boolean?: nil remaining: [file1 file2 file3]
quelle
Die alte Befehlszeile clojure.contrib.command wurde durch tools.cli ersetzt.
https://github.com/clojure/tools.cli
tools.cli hieß früher clargon. Im Folgenden finden Sie zwei Blog-Beiträge mit Beispielen für die Verwendung von tools.cli (ersetzen Sie einfach alle Verweise auf clargon durch tools.cli. Beiträge sind veraltet).
Dies zeigt einige Methoden, einschließlich der alten clojure.contrib.command-Zeile
Beitrag über Clargon vom Originalautor
quelle
Ich möchte hinzufügen, dass Sie tun können
(apply -main *command-line-args*)
unter dem
(defn -main ...)
, damit es im interpretierten Modus funktioniert.quelle
Lange nachdem die Frage aufgeworfen wurde, kann ich vorschlagen,
docopt
Bibliotheken zu verwenden, wenn es darum geht, eine CLI-Schnittstelle zu erstellen. Es gibt eine für Clojure -docopt.clj
So können Sie Ihre Benutzeroberfläche deklarieren und gleichzeitig dokumentieren - das ist erstaunlich und einfach.
Weitere Informationen finden Sie unter http://docopt.org/.
Es gibt auch eine Online-App, mit der Sie Ihre Benutzeroberfläche überprüfen können. Http://try.docopt.org/
Und zum Schluss hier mein Beispiel, wie die Clojure lib verwendet werden kann.
quelle
Vielleicht versuchen Sie es mit Jark. Jark ist ein Tool zum Ausführen von Clojure-Programmen auf einer dauerhaften JVM. Es verfügt über einige nützliche Befehlszeilenprogramme.
https://clojars.org/jark
quelle