[#194] *command-line-args* should be nil instead of empty list when no args are provided

This commit is contained in:
Michiel Borkent 2019-12-25 16:14:28 +01:00
parent 5ad851d2ed
commit edecf87b67
2 changed files with 81 additions and 76 deletions

View file

@ -34,65 +34,66 @@
(defn parse-opts [options]
(let [opts (loop [options options
opts-map {}]
(if-let [opt (first options)]
(if options
(let [opt (first options)]
(case opt
("--version") {:version true}
("--help" "-h" "-?") {:help? true}
("--verbose")(recur (rest options)
("--verbose")(recur (next options)
(assoc opts-map
:verbose? true))
("--stream") (recur (rest options)
("--stream") (recur (next options)
(assoc opts-map
:stream? true))
("--time") (recur (rest options)
("--time") (recur (next options)
(assoc opts-map
:time? true))
("-i") (recur (rest options)
("-i") (recur (next options)
(assoc opts-map
:shell-in true))
("-I") (recur (rest options)
("-I") (recur (next options)
(assoc opts-map
:edn-in true))
("-o") (recur (rest options)
("-o") (recur (next options)
(assoc opts-map
:shell-out true))
("-O") (recur (rest options)
("-O") (recur (next options)
(assoc opts-map
:edn-out true))
("-io") (recur (rest options)
("-io") (recur (next options)
(assoc opts-map
:shell-in true
:shell-out true))
("-IO") (recur (rest options)
("-IO") (recur (next options)
(assoc opts-map
:edn-in true
:edn-out true))
("-f" "--file")
(let [options (rest options)]
(recur (rest options)
(let [options (next options)]
(recur (next options)
(assoc opts-map
:file (first options))))
("--repl")
(let [options (rest options)]
(recur (rest options)
(let [options (next options)]
(recur (next options)
(assoc opts-map
:repl true)))
("--socket-repl")
(let [options (rest options)]
(recur (rest options)
(let [options (next options)]
(recur (next options)
(assoc opts-map
:socket-repl (first options))))
("--eval", "-e")
(let [options (rest options)]
(recur (rest options)
(let [options (next options)]
(recur (next options)
(assoc opts-map :expression (first options))))
("--classpath", "-cp")
(let [options (rest options)]
(recur (rest options)
(let [options (next options)]
(recur (next options)
(assoc opts-map :classpath (first options))))
("--main", "-m")
(let [options (rest options)]
(recur (rest options)
(let [options (next options)]
(recur (next options)
(assoc opts-map :main (first options))))
(if (some opts-map [:file :socket-repl :expression :main])
(assoc opts-map
@ -101,10 +102,10 @@
(.exists (io/file opt)))
(assoc opts-map
:file opt
:command-line-args (rest options))
:command-line-args (next options))
(assoc opts-map
:expression opt
:command-line-args (rest options)))))
:command-line-args (next options))))))
opts-map))]
opts))

View file

@ -21,15 +21,15 @@
(testing "distinguish automatically between expression or file name"
(is (= {:expression "(println 123)"
:command-line-args []}
:command-line-args nil}
(main/parse-opts ["(println 123)"])))
(is (= {:file "src/babashka/main.clj"
:command-line-args []}
:command-line-args nil}
(main/parse-opts ["src/babashka/main.clj"])))
(is (= {:expression "does-not-exist"
:command-line-args []}
:command-line-args nil}
(main/parse-opts ["does-not-exist"])))))
(deftest main-test
@ -318,10 +318,14 @@
(defn foo [] (println \"foo!\"))
(with-out-str
(with-in-str \"(foo)\"
(clojure.main/repl :init (fn []) :prompt (fn [] (print \"> \")))))")))
(clojure.main/repl :init (fn []) :prompt (fn [] (print \"> \")))))"))))
(deftest command-line-args-test
(is (true? (bb nil "(nil? *command-line-args*)")))
(is (= ["1" "2" "3"] (bb nil "*command-line-args*" "1" "2" "3"))))
;;;; Scratch
(comment
(dotimes [_ 10] (wait-for-port-test))
))
)