Я только начал работать с Clojure (пришедшим из Ruby) и хотел бы создать небольшое приложение с интерфейсом командной строки. Как мне обрабатывать ввод / вывод в CL?
Я заметил, что есть командная строка clojure.contrib.com, но документации мало.
Я только начал работать с Clojure (пришедшим из Ruby) и хотел бы создать небольшое приложение с интерфейсом командной строки. Как мне обрабатывать ввод / вывод в CL?
Я заметил, что есть командная строка clojure.contrib.com, но документации мало.
Ответы:
Вот пример использования его 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.contrib.com заменена на tools.cli.
https://github.com/clojure/tools.cli
tools.cli раньше назывался кларгоном. Ниже приведены два сообщения в блоге, в которых приведены примеры использования tools.cli (просто замените любую ссылку на Clargon на tools.cli. Сообщения устарели).
Здесь показано несколько способов, включая старую строку clojure.contrib.command-line
Спустя долгое время после того, как вопрос был поднят, я могу предложить использовать docopt
библиотеки, когда дело доходит до создания интерфейса командной строки. Там является один для Clojure -docopt.clj
docopt основан на соглашениях, которые десятилетиями используются в справочных сообщениях и страницах руководства для описания интерфейса программы. Описание интерфейса в docopt - вот такое справочное сообщение, но формализованное
Таким образом, вы можете объявить свой интерфейс и задокументировать его одновременно - это потрясающе и легко.
Для получения дополнительной информации я рекомендую проверить http://docopt.org/
Также есть онлайн-приложение для проверки вашего интерфейса http://try.docopt.org/
И, наконец, вот мой пример того, как можно использовать Clojure lib.
Может, попробуй джарк. Jark - это инструмент для запуска программ закрытия на постоянной JVM. В нем есть несколько полезных утилит командной строки.
jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args