Создание приложения Clojure с интерфейсом командной строки?
Я только что начал с Clojure (исходя из Ruby), и я хотел бы создать небольшое приложение с интерфейсом командной строки. Как я могу обрабатывать ввод / вывод в CL?
Я заметил, что есть clojure.ВНО.командная строка, но документация тонкая.
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.