簡體   English   中英

如何在 Clojure 中使用命令行參數?

[英]How to use command line arguments in Clojure?

我正在研究我的第一個 Clojure 程序。 我剩下要做的一件事是讓我的程序接受命令行參數。 args 的數量可以變化(但至少需要一個),然后每個命令行 arg 需要作為參數提供給我的main的函數,一次一個。 我一直在網上閱讀,似乎clojure/tools.cli是這樣做的方法,(可能使用parse-opts ?)。 但我無法弄清楚我的生活。 沒有驗證,確實需要進行驗證——用戶提供的任何內容都是有效的。 (唯一需要檢查的是至少提供了一個參數)。 關於如何解決這個問題的任何建議?

我遇到的所有示例看起來都非常復雜,而且很容易讓我無法理解。

我正在嘗試做的一個簡單示例是在用戶提供任意數量的命令行參數之后,然后讓 clojure 在終端的新行中​​打印每個字符串。

我使用 leiningen 來運行我的程序。

簡單的方法是使用clojure.core/*command-line-args*

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

由於您的整個問題似乎歸結為:

我正在嘗試做的一個簡單示例是在用戶提供任意數量的命令行參數之后,然后讓 clojure 在終端的新行中​​打印每個字符串。

我會回答那個。 這可以相當簡潔地完成:

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

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

請注意,除非您絕對想在傳遞 0 個參數時徹底失敗,否則您可以跳過seq檢查。 如果args為空,則doseq將不會運行,因為沒有任何要迭代的內容。

您還可以將整個doseq替換為:

(mapv println args)

但這可以說是對mapv的濫用。

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 從 Clojure 1.9 版開始提供。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM