You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Clojure中使用命令行参数?

解决Clojure命令行可变参数处理问题

嘿,我来帮你搞定这个命令行参数的问题!用clojure/tools.cli确实能轻松实现需求,还能顺便加参数验证,我给你一步步拆解:

第一步:添加依赖

首先得确保你的项目里引入了tools.cli库,在project.clj的:dependencies里加上:

[org.clojure/tools.cli "1.0.206"] ; 选一个稳定版本即可

第二步:完整代码实现

下面是一个可直接运行的示例,包含参数解析、数量验证,以及逐个调用指定函数的逻辑:

(ns myapp.core
  (:require [clojure.tools.cli :refer [parse-opts]]
            [clojure.string :as str]))

;; 这里替换成你自己的"指定函数",示例是打印参数信息
(defn process-arg [arg]
  (println (str "处理参数: '" arg "',长度: " (count arg))))

;; 定义CLI选项(如果不需要额外选项,保持空向量即可)
(def cli-options
  [["-h" "--help" "显示帮助信息" :default false]
   ["-v" "--verbose" "启用 verbose 模式" :default false]])

;; 生成帮助信息的函数
(defn usage [options-summary]
  (str/join \newline
            ["我的第一个Clojure程序"
             ""
             "用法: lein run [选项] 参数1 [参数2 ...]"
             ""
             "选项:"
             options-summary
             ""
             "参数:"
             "  参数1, 参数2...  至少需要传入一个参数"]))

(defn -main [& args]
  (let [{:keys [options arguments errors summary]} (parse-opts args cli-options)]
    (cond
      ;; 如果用户输入--help,打印帮助信息后退出
      (:help options) (do
                        (println (usage summary))
                        (System/exit 0))
      ;; 如果参数解析出错,打印错误信息
      errors (do
               (println "错误:" (str/join ", " errors))
               (System/exit 1))
      ;; 验证参数数量:至少一个
      (empty? arguments) (do
                           (println "错误: 至少需要传入一个参数!")
                           (println (usage summary))
                           (System/exit 1))
      ;; 所有验证通过,逐个处理参数
      :else (do
              (when (:verbose options)
                (println "Verbose模式已开启,开始处理参数..."))
              (doseq [arg arguments]
                (process-arg arg))
              (println "所有参数处理完成!")))))

第三步:关键逻辑解释

  1. 参数解析:parse-opts会把命令行参数拆分成两部分:options(带--/-的选项)和arguments(位置参数,也就是你需要的可变参数)。
  2. 验证逻辑:
    • 先检查是否有解析错误(比如输入了不存在的选项)
    • 再检查arguments是否为空,确保至少有一个参数传入
  3. 参数处理:用doseq遍历所有位置参数,逐个传入你的process-arg函数(替换成你自己的业务函数即可)。

测试方法

用Leiningen运行测试:

# 传入单个参数
lein run "hello clojure"

# 传入多个参数
lein run -v arg1 arg2 "带空格的参数"

# 查看帮助
lein run --help

# 不传参数(会触发错误提示)
lein run

这样就能完美实现你要的功能啦!

内容的提问来源于stack exchange,提问作者orangeorangepeel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:15:20