Clojure Don’ts: Numbered Parameters

Continuing my series of Clojure do’s and don’ts — which, as always, is a mix of technical recommendations and my personal stylistic preferences — and continuing on the topic of the previous post in this series, here are some more arbitrary rules about anonymous functions.

I’m doubling down the assertion in my last post: The short anonymous function syntax #() is only for simple functions consisting of a single function or method call. Anything else deserves at least the standard fn syntax with named parameters.

I’ll go even further: Only use #() with the single parameter %. Do not use numbered parameters, as in %1, %2, %3, %&. Unless you’re playing code golf or writing Swearjure, unnamed parameters are not worth the saved characters.

I can hear the whinging already. “But what about …” No buts.

Function parameter names are one of the most important conveyors of meaning in code. In a dynamically-typed language like Clojure, they are even more important. (Static typists, this does not let you off the hook. Types alone are not enough to convey the meaning of a parameter.)

Whenever I see a cluster of characters like #(%2 %1), I have to stop for a moment and speculate about what those unnamed parameters represent. I have to make an educated guess based on context. Named parameters are always clearer.

Think of the poor, benighted Perl and Bash programmers, so bereft of named parameters they have to simulate them!