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


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]

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


12

Dodam, że dasz radę

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

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


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.


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 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.