如何在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 "所有参数处理完成!")))))
第三步:关键逻辑解释
- 参数解析:
parse-opts会把命令行参数拆分成两部分:options(带--/-的选项)和arguments(位置参数,也就是你需要的可变参数)。 - 验证逻辑:
- 先检查是否有解析错误(比如输入了不存在的选项)
- 再检查
arguments是否为空,确保至少有一个参数传入
- 参数处理:用
doseq遍历所有位置参数,逐个传入你的process-arg函数(替换成你自己的业务函数即可)。
测试方法
用Leiningen运行测试:
# 传入单个参数 lein run "hello clojure" # 传入多个参数 lein run -v arg1 arg2 "带空格的参数" # 查看帮助 lein run --help # 不传参数(会触发错误提示) lein run
这样就能完美实现你要的功能啦!
内容的提问来源于stack exchange,提问作者orangeorangepeel
相关产品推荐
相关产品推荐

