Take the 2-minute tour ×

In Common Lisp you can do this:

(defun foo (bar &key baz quux)
  (list bar baz quux))

(foo 1 :quux 3 :baz 2) ; => (1 2 3)

Clojure doesn't have keyword arguments. One alternative is this:

(defn foo [bar {:keys [baz quux]}] 
  (list bar baz quux))

(foo 1 {:quux 3 :baz 2}) ; => (1 2 3)

That's too many nested brackets to have to type and read all the time. It also requires an explicit hash-map to be passed in as an argument rather than a flat list.

What's the most idiomatic Clojure equivalent of keyword arguments that doesn't look someone set off a punctuation bomb?

share|improve this question
Since this question was last active keyword destructuring binding has been added to Clojure. I have provided an answer to indicate this. –  Alex Stoddard Oct 19 '10 at 15:30
@Brian you should consider updating the accepted answer. –  Brad Koch Jul 31 at 16:27

3 Answers 3

up vote 37 down vote accepted

A simple way to simulate keyword args in clojure is using hash-map on rest parameters like this:

> (defn kwtest [x & e] (:foo (apply hash-map e)))
> (kwtest 12 :bar "ignored" :foo "returned")

Rich Hickey provided a macro in this message from the clojure google group that gives you keyword parameters. The corresponding thread contains information about why keyword parameters are not supported by clojure. Basically to avoid the runtime overhead. Rich explains the method I've shown above in this message

share|improve this answer
See Alex Stoddard's answer; support for keyword args has been added into the parameter binding. –  Brad Koch Jul 31 at 16:31

To update this answer for Clojure 1.2 there is now full keyword arg support with defaults provided by the map forms of destructing binding:

user> (defn foo [bar &{ :keys [baz quux] 
                        :or {baz "baz_default" quux "quux_default"}}]
         (list bar baz quux))

user> (foo 1 :quux 3)
(1 "baz_default" 3)
share|improve this answer
I think this should be promoted to be the answer? –  john2x Jan 16 at 1:23

A recent addition to clojure.contrib.def is the defnk macro, which enables definition of functions with keyword arguments (see here).

share|improve this answer

Your Answer


