Search code examples
clojure

What is the "name?" argument in Clojure's fn?


I am reading the book "Getting Clojure" by Russ Olsen. In chapter 8, "Def, Symbols, and Vars", there is the following function definition:

(def second (fn second [x] (first (next x))))
                ^^^^^^

My question is regarding the underlined second, which comes second.

At first, I thought this syntax is wrong as anonymous functions don't need a name. But as it turnes out, this syntax is correct.

Usage: (fn name? [params*] exprs*)
       (fn name? ([params*] exprs*) +)

I tried comparing the following two function calls.

user> (fn second [x] (first (rest x)))
#function[user/eval5642/second--5643]
user> (fn [x] (first (rest x)))
#function[user/eval5646/fn-5647]

Besides the name of the function, there does not seem to be a difference.

Why would there be a name? argument to fn?


Solution

  • You can use it when creating multiple arities:

    (fn second
          ([x] (second x 1))
          ([x y] (+ x y)))
    

    or if you need to make a recursive call:

    (fn second [x] (when (pos? x)
                      (println x)
                      (second (dec x))))