Я только что начал w/ Clojure (из Ruby), и я хотел бы создать небольшое приложение с интерфейсом командной строки. Как обрабатывать ввод/вывод в CL?
Я заметил, что существует clojure.contrib.command-line, но документация тонкая.
Я только что начал w/ Clojure (из Ruby), и я хотел бы создать небольшое приложение с интерфейсом командной строки. Как обрабатывать ввод/вывод в CL?
Я заметил, что существует clojure.contrib.command-line, но документация тонкая.
Вот пример использования макроса 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.command-line был заменен на tools.cli.
https://github.com/clojure/tools.cli
tools.cli раньше назывался clargon. Ниже приведены два сообщения в блоге, в которых приводятся примеры использования tools.cli(просто замените любую ссылку на clargon на tools.cli. Сообщения устарели).
Это показывает несколько способов, включая старую clojure.contrib.command-line
Я хотел бы добавить, что вы можете сделать
(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. У него есть полезные утилиты командной строки.
jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args