clojure clojure-contrib

¿Construir una aplicación Clojure con una interfaz de línea de comandos?



clojure-contrib (5)

La antigua clojure.contrib.command-line ha sido reemplazada por tools.cli.

github.com/clojure/tools.cli

tools.cli solía llamarse clargon. A continuación hay dos entradas de blog que dan ejemplos del uso de tools.cli (simplemente reemplace cualquier referencia a clargon con tools.cli. Las publicaciones están desactualizadas).

Esto muestra algunas formas de métodos, incluido el antiguo clojure.contrib.command-line

Publicación centrada en Clargon por autor original

Empecé con Clojure (procedente de Ruby) y me gustaría crear una pequeña aplicación con una interfaz de línea de comandos. ¿Cómo manejo la entrada / salida a una CL?

Noté que hay una línea de pedido y clojure.contrib.com, pero la documentación es delgada.

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


Me gustaría agregar que puedes hacer

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

debajo de (defn -main ...) para que funcione en modo interpretado.


Mucho tiempo después de plantear la pregunta, puedo sugerir el uso de docopt bibliotecas docopt a la hora de compilar la interfaz CLI. Hay uno para Clojure - docopt.clj

docopt se basa en convenciones que se utilizan durante décadas en mensajes de ayuda y páginas man para la descripción de la interfaz del programa. La descripción de la interfaz en docopt es un mensaje de ayuda, pero formalizado

Así que puedes declarar tu interfaz y documentarla al mismo tiempo; eso es increíble y fácil de hacer.

Para más detalles, recomiendo comprobar http://docopt.org/

También hay una aplicación en línea para verificar su interfaz http://try.docopt.org/

Y finalmente aquí está mi ejemplo de cómo se puede usar la biblioteca de Clojure.


Tal vez intente Jark. Jark es una herramienta para ejecutar programas de clojure en una JVM persistente. Tiene algunas útiles utilidades de línea de comandos.

https://clojars.org/jark

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


Aquí hay un ejemplo de cómo usar su macro con with-command-line . El siguiente código especifica una clase trivial con un método principal que no hace más que imprimir los valores de sus argumentos de línea de comando.

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

Compila la clase en REPL:

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

Ejemplo de uso

1) Ejecutar sin argumentos de línea de comando hará que se muestre la información de ayuda. La información de ayuda también puede mostrarse con --help or -h flags. Tenga en cuenta que la información de ayuda se genera automáticamente desde su 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) Los argumentos no especificados reciben el valor predeterminado como se especifica en el enlace cmdspec. Por ejemplo, bar tiene un valor predeterminado de 2 .

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

3) Los indicadores booleanos se indican con el sufijo "?" en el cmdspec. Tenga en cuenta que la bandera en sí no incluye el "?" como parte de su nombre.

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

4) También tenga en cuenta que puede especificar alias de indicador especificando múltiples símbolos en la especificación cmdspec. He hecho esto con boolean? y b? banderas.

5) Finalmente, he especificado que remaining todos los argumentos restantes sin banderas asociadas.

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