Как использовать аргументы командной строки в Clojure? - PullRequest
0 голосов
/ 28 апреля 2018

Я пробираюсь через одну из моих первых программ Clojure. Единственное, что мне осталось сделать - это заставить мою программу принимать аргументы командной строки. Количество аргументов может варьироваться (но должно быть не менее одного), и тогда каждый аргумент командной строки должен быть предоставлен в качестве аргумента функции в моем main, по одному за раз. Я читал онлайн, и кажется, что clojure/tools.cli - это способ сделать это (возможно, с использованием parse-opts). Но я не могу понять это для моей жизни. Там нет проверки, на самом деле это должно произойти - все, что бы пользователь ни предоставил, будет действительным. (Единственное, что нужно проверить, это наличие хотя бы одного аргумента). Любые предложения о том, как это сделать?

Все примеры, с которыми я сталкиваюсь, кажутся очень сложными и легко заполняют мою голову.

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

Я использую leiningen для запуска своих программ.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Поскольку весь ваш вопрос сводится к:

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

Я отвечу на это. Это можно сделать довольно кратко:

(defn -main [& args] ; & creates a list of var-args
  (if-not (empty? args)
    ; Foreach arg, print the arg...
    (doseq [arg args]
      (println arg))

    ; Handle failure however here
    (throw (Exception. "Must have at least one argument!"))))

Обратите внимание: если вы не абсолютно не захотите сразу потерпеть неудачу при передаче 0 аргументов, вы можете пропустить проверку empty?. doseq не будет работать, если args пусто, так как перебирать нечего.

Вы также можете заменить все doseq на:

(mapv println args)

Но это, возможно, злоупотребление mapv.

0 голосов
/ 28 апреля 2018

Clojure Spec может делать много вещей, и разбор и проверка аргументов командной строки - одна из таких вещей. Вот пример:

(ns cmdargs.core
  (:require [clojure.spec.alpha :as spec]))

;; Specification of a single argument.
;; For example, replace `any?` by `number?`
;; if your program only accepts numeric args.
(spec/def ::arg any?)

(spec/def ::args (spec/+ ::arg))

(defn my-fun [& args]
  (doseq [arg args]
    (println "Got arg: " arg)))

(defn -main [& args]
  (let [parsed-args (spec/conform ::args args)]
    (if (= ::spec/invalid parsed-args)
      (do (println "Bad commandline arguments")
          (spec/explain ::args args))
      (apply my-fun parsed-args))))

Clojure Spec поставляется с версией 1.9 Clojure.

0 голосов
/ 28 апреля 2018

Простой способ использования clojure.core/*command-line-args*:

(doseq [arg *command-line-args*]
  (println (str "Read an argument: " arg)))
...