web-dev-qa-db-fra.com

Construire une application de clojure avec une interface de ligne de commande?

Je viens de commencer avec Clojure (venant de Ruby) et je voudrais construire une petite application avec une interface de ligne de commande. Comment gérer l'entrée/la sortie à un CL?

J'ai remarqué qu'il y ait une ligne de clojure.contrib.comand, mais la documentation est mince.

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

78
dMix

Voici un exemple d'utilisation de son with-command-line macro. Le code suivant spécifie une classe triviale avec une méthode principale qui ne fait que imprimer les valeurs de ses arguments de ligne de commande.

(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)))

Compilez la classe sur la REMPL:

user> (compile 'cmd-line-demo)
cmd-line-demo

Exemple d'utilisation

1) Exécution sans arguments de ligne de commande entraînera l'affichage des informations d'aide. Les informations d'aide peuvent également être affichées avec --help ou -h drapeaux. Notez que les informations d'aide sont automatiquement générées à partir de votre 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) Les arguments non spécifiés reçoivent la valeur par défaut comme spécifié dans la liaison CMDSPEC. Par exemple, bar a une valeur par défaut de 2.

$ Java -classpath . cmd_line_demo --foo "changed value"
foo:  changed value
bar:  2
boolean?:  nil
remaining:  []

3) Les drapeaux booléens sont notés par le suffixe "?" dans la CMDSPEC. Notez que le drapeau lui-même non inclure le "?" dans le cadre de son nom.

$ Java -classpath . cmd_line_demo -boolean
foo:  1
bar:  2
boolean?:  true
remaining:  []

4) Notez également que vous pouvez spécifier des alias de signalisation en spécifiant plusieurs symboles dans la CMDSPEC. Je l'ai fait avec le boolean? et b? drapeaux.

5) Enfin, j'ai précisé que remaining capture tous les arguments restants sans drapeaux associés.

$ Java -classpath . cmd_line_demo -foo test file1 file2 file3
foo:  test
bar:  2
boolean?:  nil
remaining:  [file1 file2 file3]
119
alanlcode

L'ancien clojure.contrib.comand-ligne a été remplacé par des outils.cli.

https://github.com/clojure/tools.cli

outils.cli était appelé Clargon. Vous trouverez ci-dessous deux poteaux de blog qui donnent des exemples d'outils.cli (simples remplacent toute référence à Clargon avec des outils.CLI. Les publications sont obsolètes).

Cela montre quelques méthodes méthodes, y compris Old Clojure.Contrib.comMand-Line

Post se concentrer sur Clargon par l'auteur d'origine

32
Jake McCrary

J'aimerais ajouter que vous pouvez faire

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

sous le (defn -main ...) Pour que cela fonctionne en mode interprété.

12
Pepijn

Longtemps après que la question ait été soulevée, je peux suggérer d'utiliser des bibliothèques docopt lorsqu'il s'agit de créer une interface CLI. Là est un pour Clojure - docopt.clj

dOCOPT est basé sur des conventions utilisées depuis des décennies dans des messages d'aide et des pages de l'homme pour la description de l'interface de programme. Description de l'interface dans DOCOPT est un message d'aide, mais formalisé

Donc, vous pouvez déclarer votre interface et le documenter en même temps - qui est incroyable et facile à faire.

Pour plus de détails, je vous recommande de vérifier http://docopt.org/

Il existe également une application en ligne pour vérifier votre interface http://try.docopt.org/

Et enfin voici mon exemple Comment la libéliole peut être utilisée.

7
signalpillar

Peut-être essayer Jark. Jark est un outil pour exécuter des programmes de clojure sur une JVM persistante. Il a des utilitaires de commande utiles.

https://clojars.org/jark

jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args 
1
icylisper