Створення програми Clojure з інтерфейсом командного рядка?


79

Я щойно розпочав роботу з Clojure (із Ruby), і я хотів би створити невеликий додаток з інтерфейсом командного рядка. Як мені обробляти вхід / вихід у CL?

Я помітив, що існує рядок clojure.contrib.command, але документація невелика.

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


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]

Чудово, це було саме те, що я шукав. Дуже ретельно. Сподіваюся, це добре
позначається

1
Це справді найдивовижніший приклад цього з існуючих.
Алекс Міллер,

9
Для Clojure 1.3 люди, мабуть, повинні почати використовувати tools.cli (новий внесок). Див. Dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go and github.com/clojure/tools.cli
semperos

33

Старий рядок clojure.contrib.command замінено на tools.cli.

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

tools.cli раніше називали кларгоном. Нижче наведено дві публікації в блозі, які містять приклади використання tools.cli (просто замініть будь-яке посилання на clargon на tools.cli. Публікації застаріли).

Це показує декілька методів, включаючи старий clojure.contrib.command-line

Пост, присвячений Кларгону оригінальним автором


12

Я хотів би додати, що ви можете це зробити

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

нижче, (defn -main ...)щоб це працювало в інтерпретованому режимі.


7

Довгий час після того, як було порушено питання, я можу запропонувати використовувати docoptбібліотеки, коли мова заходить про побудову інтерфейсу CLI. Є один для Clojure -docopt.clj

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

Тож ви можете заявити свій інтерфейс і задокументувати його - це дивно і легко зробити.

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

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

І нарешті, ось мій приклад, як можна використовувати бібліотеку Clojure.


1

Можливо, спробуйте jark Jark - це інструмент для запуску програм clojure на постійній JVM. У ньому є кілька корисних утиліт командного рядка.

https://clojars.org/jark

jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.