78 votes

Construire une application Clojure avec une interface en ligne de commande?

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

J'ai remarqué qu'il y a un clojure.contrib.command-line, mais la documentation est mince.

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

119voto

alanlcode Points 2843

Voici un exemple d'utilisation de son macro with-command-line. Le code suivant spécifie une classe anodine avec une méthode principale qui ne fait rien d'autre que d'afficher 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
      "Démonstration de la ligne de commande"
      [[foo "Ceci est la description de foo" 1]
       [bar "Ceci est la description de bar" 2]
       [boolean? b? "Il s'agit d'un indicateur booléen."]
       remaining]
    (println "foo: " foo)
    (println "bar: " bar)
    (println "boolean?: " boolean?)
    (println "remaining: " remaining)))

Compiler la classe dans le REPL:

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

Exemple d'utilisation

1) Exécuter sans arguments de ligne de commande fera s'afficher les infos d'aide. Les infos d'aide peuvent aussi être affichées avec les indicateurs --help ou -h. Notez que les infos d'aide sont automatiquement générées à partir de votre cmdspec.

$ java -classpath . cmd_line_demo
Démonstration de la ligne de commande
Options
  --foo     Ceci est la description de foo  [défaut 1]
  --bar     Ceci est la description de bar  [défaut 2]
  --boolean, -b  Il s'agit d'un indicateur booléen.  

2) Les arguments non spécifiés reçoivent la valeur par défaut spécifiée dans la liaison cmdspec. Par exemple, bar a une valeur par défaut de 2.

$ java -classpath . cmd_line_demo --foo "valeur changée"
foo:  valeur changée
bar:  2
boolean?:  nil
remaining:  []

3) Les indicateurs booléens sont indiqués par le suffixe "?" dans le cmdspec. Notez que le drapeau lui-même n'inclut pas le "?" dans 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 drapeaux en spécifiant plusieurs symboles dans le cmdspec. J'ai fait cela avec les drapeaux boolean? et b?.

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

$ java -classpath . cmd_line_demo -foo test fichier1 fichier2 fichier3
foo:  test
bar:  2
boolean?:  nil
remaining:  [fichier1 fichier2 fichier3]

32voto

Jake McCrary Points 805

L'ancien clojure.contrib.command-line a été remplacé par tools.cli.

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

tools.cli s'appelait auparavant clargon. Ci-dessous se trouvent deux articles de blog donnant des exemples d'utilisation de tools.cli (remplacez simplement toute référence à clargon par tools.cli. Les articles sont obsolètes).

Cela montre quelques méthodes, y compris l'ancien clojure.contrib.command-line

Article se concentrant sur Clargon par l'auteur original

12voto

Pepijn Points 1716

Je voudrais ajouter que vous pouvez faire

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

en dessous de la (defn -main ...) pour le rendre fonctionnel en mode interprété.

7voto

signalpillar Points 486

Long time after the question was raised I can suggest to use docopt libraries when it comes to build CLI interface. There is one for Clojure - docopt.clj

docopt is based on conventions that are used for decades in help messages and man pages for program interface description. Interface description in docopt is such a help message, but formalized

Donc vous pouvez déclarer votre interface et la documenter en même temps - c'est étonnant et facile à faire.

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

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

Et enfin voici mon exemple de la façon dont la bibliothèque Clojure peut être utilisée.

1voto

icylisper Points 25

Peut-être essayer jark. Jark est un outil pour exécuter des programmes clojure sur un JVM persistant. Il possède quelques utilitaires en ligne de commande utiles.

https://clojars.org/jark

jark ns load file.clj
jark . 
jark if cli-json  args

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X