Tuesday, 27 January 2009

Passing Parameters in Clojure

Clojure has support for a number of ways of passing parameters. A function body can have multiple function bodies associated with it, each with different arity. This isn't any where near as general as Haskell's pattern matching (see [1]).

user> (defn foo ([x] x) ([x y] (+ x y)) ([x y z] (+ x y z)))
user> (foo 1)
user> (foo 1 2)
user> (foo 1 2 3)

Similarly, you can make a var arg function with the & notation.

user> (defn bar ([x] x) ([x & rest-args] (reduce + (cons x rest-args))))
user> (bar 1)
user> (bar 1 2 3 4 5 6 7)

The last option for parameter passing is keywords, the parameter list becomes a map. This is discussed in more detail here.