Tworzysz aplikację Clojure z interfejsem wiersza poleceń?

79

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.

http://github.com/richhickey/clojure-contrib/blob/ffa868411cda6c617105b52b4f6f9e0f37ee8c24/src/clojure/contrib/command_line.clj

dMix
źródło
9
Pamiętaj, że jeśli Twoja aplikacja jest często uruchamiana, za każdym razem zapłacisz koszty uruchomienia maszyny JVM.
Stuart Sierra
1
@StuartSierra Nie z kroplówką
Ben,

Odpowiedzi:

120

Oto przykład użycia jego with-command-linemakra. 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 --helplub -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 barma 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 remainingprzechwytuje 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]
alanlcode
źródło
Niesamowite, to było dokładnie to, czego szukałem. Bardzo dokładny. Mam nadzieję, że to dobrze plasuje się w Google :)
dMix
1
To jest rzeczywiście najwspanialszy tego przykład.
Alex Miller,
9
W przypadku Clojure 1.3 ludzie prawdopodobnie powinni zacząć używać tools.cli (nowy wkład). Zobacz dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go i github.com/clojure/tools.cli
semperos
33

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

Jake McCrary
źródło
12

Dodam, że dasz radę

(apply -main *command-line-args*)

poniżej, (defn -main ...)aby działał w trybie interpretowanym.

Pepijn
źródło
7

Długo po zadaniu pytania mogę zasugerować użycie docoptbibliotek 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.

sygnalizator
źródło
1

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

jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args 
icylisper
źródło