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