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

79

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

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

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

dMix
источник
9
Имейте в виду, что если ваше приложение запускается часто, вы будете каждый раз оплачивать стоимость запуска JVM.
Стюарт Сьерра,
1
@StuartSierra Не с капельницей
Бен

Ответы:

120

Вот пример использования его 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]
alanlcode
источник
Потрясающе, это именно то, что я искал. Очень тщательно. Я надеюсь, что это хорошо в Google :)
dMix
1
Это действительно самый замечательный пример из существующих.
Алекс Миллер,
9
Для Clojure 1.3 люди, вероятно, должны начать использовать tools.cli (новый contrib). См. Dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go и github.com/clojure/tools.cli
semperos
33

Старая строка команды clojure.contrib.com заменена на tools.cli.

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

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

Здесь показано несколько способов, включая старую строку clojure.contrib.command-line

Сообщение оригинального автора о Clargon

Джейк МакКрари
источник
12

Хочу добавить, что ты можешь сделать

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

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

Pepijn
источник
7

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

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

Таким образом, вы можете объявить свой интерфейс и задокументировать его одновременно - это потрясающе и легко.

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

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

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

сигнальный столб
источник
1

Может, попробуй джарк. Jark - это инструмент для запуска программ закрытия на постоянной JVM. В нем есть несколько полезных утилит командной строки.

https://clojars.org/jark

jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args 
ледяной
источник