Как избежать исключения в потоке main clojure.lang.ArityException?

Когда пользователь не указывает аргументы командной строки, я хочу, чтобы Hello World распечатывал информацию об использовании вместо трассировки ошибок.

":";exec clj -m `basename $0 .clj` ${1+"$@"}
":";exit

(ns hello
    (:gen-class))

(defn -main
    [greetee]
    (println (str "Hello " greetee "!")))

$ ./hello.clj Fred
Hello Fred!
$ ./hello.clj 
Exception in thread "main" clojure.lang.ArityException: Wrong number of args (0) passed to: hello$-main
    at clojure.lang.AFn.throwArity(AFn.java:439)
    at clojure.lang.AFn.invoke(AFn.java:35)
    at clojure.lang.Var.invoke(Var.java:397)
    at clojure.lang.AFn.applyToHelper(AFn.java:159)
    at clojure.lang.Var.applyTo(Var.java:518)
    at clojure.core$apply.invoke(core.clj:600)
    at clojure.main$main_opt.invoke(main.clj:323)
    at clojure.lang.FnLoaderThunk.invoke(FnLoaderThunk.java:36)
    at clojure.main$main.doInvoke(main.clj:426)
    at clojure.lang.RestFn.invoke(RestFn.java:422)
    at clojure.lang.FnLoaderThunk.invoke(FnLoaderThunk.java:36)
    at clojure.lang.Var.invoke(Var.java:405)
    at clojure.lang.AFn.applyToHelper(AFn.java:165)
    at clojure.lang.Var.applyTo(Var.java:518)
    at clojure.main.main(main.java:37)

person mcandre    schedule 08.03.2011    source источник


Ответы (1)


(defn -main [& args]
  (if-not (first args)
    (usage)
    (println "Hello" (first args))))

Вы можете немного улучшить это, но это разумный план.

person amalloy    schedule 08.03.2011
comment
Спасибо чувак! Вы оказались ценным ресурсом по Clojure. - person mcandre; 08.03.2011
comment
Вы также можете проверить github.com/amalloy/clojopts, мою библиотеку для разбора опций. Он еще не отправляет сообщения об использовании, но он в списке пожеланий, и вы можете внести свой вклад, если хотите. - person amalloy; 08.03.2011