Создание приложения Clojure с интерфейсом командной строки?


Я только что начал с Clojure (исходя из Ruby), и я хотел бы создать небольшое приложение с интерфейсом командной строки. Как я могу обрабатывать ввод / вывод в CL?

Я заметил, что есть clojure.ВНО.командная строка, но документация тонкая.

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

5 77

5 ответов:

пример использования with-command-line макрос. В следующем коде указывается тривиальный класс с основным методом, который ничего не делает, кроме вывода значений аргументов командной строки.

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

скомпилировать класс в REPL:

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

пример использования

1) Выполнение без аргументов командной строки приведет к отображению справочной информации. Справочную информацию также можно отобразить с помощью --help или -h флаги. Обратите внимание, что справка информация автоматически генерируется из вашего 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) неопределенные аргументы получают значение по умолчанию, указанное в привязке cmdspec. Например, bar значение по умолчанию 2.

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

3) логические флаги обозначаются суффиксом "?- в cmdspec. Обратите внимание, что сам флаг делает не включить "?"как часть его имени.

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

4) Также обратите внимание, что вы можете указать псевдонимы флагов, указав несколько символов в cmdspec. Я сделал это с boolean? и b? флаги.

5) Наконец, я указал, что remaining захват всех оставшихся аргументов без связанных флагов.

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

старый clojure.ВНО.командная строка была заменена на инструменты.кли.

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

инструменты.раньше кли называли кларгоном. Ниже приведены два сообщения в блоге, которые дают примеры использования инструментов.командной строки (просто заменить любую ссылку на clargon с инструментами.кли. Сообщения устарели).

это показывает несколько способов методов, в том числе старый clojure.ВНО.командная строка

пост с упором на Кларгон от оригинального автора

Я хотел бы добавить, что вы можете сделать

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

ниже (defn -main ...) чтобы заставить его работать в режиме интерпретации.

долгое время после того, как вопрос был поднят, я могу предложить использовать docopt библиотеки, когда речь заходит о создании интерфейса CLI. Там - один для Clojure - docopt.clj

docopt основан на соглашениях, которые десятилетиями используются в справочных Сообщениях и справочных страницах для описания интерфейса программы. Описание интерфейса в docopt-это такое справочное сообщение, но формализованное

вы можете объявить интерфейс и документов в то же время - это удивительно и просто.

для более подробной информации я рекомендую проверить http://docopt.org/

также есть онлайн-приложение для проверки вашего интерфейса http://try.docopt.org/

и наконец вот мой пример как можно использовать Clojure lib.

может попробовать jark. Jark-это инструмент для запуска программ clojure на постоянной JVM. Он имеет некоторые полезные утилиты командной строки.

https://clojars.org/jark

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