I found it hard to figure out how best to get common lisp-style keyword 
arguments with defaults, and had been doing it in a clunky way until Chas 
showed me the way I show below. Now I've had a student also fail to figure it 
out until I showed him, and it occurred to me that maybe I should suggest 
adding this to the documentation (or adding it more prominently if it's already 
there somewhere). Where? I don't know, but maybe it ought to be described both 
in documentation for fn (http://clojure.org/special_forms#fn), since there's 
already mention of & (rest) arguments there, and in places like clojuredocs.

I do realize that this is just a special case of let binding, but if it's a 
good idiom for use in defn then it'd be nice for it to be more described more 
conspicuously.

(defn foo
  "This function takes arguments specified with keywords, with defaults."
  [& {:keys [arg1 arg2 arg3]
      :or {arg1 0
           arg2 [0 1 2]
           arg3 '(a b c)}}]
  (println "Called with arg1 =" arg1 ", arg2 =" arg2 ", arg3 =" arg3))

(foo)
(foo :arg1 17)
(foo :arg2 17)
(foo :arg3 17)
(foo :arg3 100 :arg1 "hi!")
(foo :arg2 :funky! :arg3 100 :arg1 "hi!")

 -Lee

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to