Notes

1Some say functional languages don’t have design patterns. I’d argue that those people are confusing the idea of design patterns with the particular design patterns applicable to object-oriented languages.

2In mathy terms, the truth statements can contain only constants, like 3+3 = 2×3. But because you’re a human and good at generalizing, you can read sets of such examples and infer universally-quantified facts like ∀y: y+y = 2×y.

3Well, I wrote Midje so I would say that, wouldn’t I?

4When a function calls itself as the very last action in a path through its code, that’s called tail-recursive. In many languages, the compiler automatically converts those calls into more efficient loops. Clojure doesn’t do that, which is why it has a special loop ... recur construct.

5As of Specter 0.11, Specter caches the results of predict-select-computation for you, so you’ll probably never call it (or, rather, Specter’s version comp-paths) in client code.

6As Specter has evolved, even more performance tricks have been added. See the wiki for an overview.

7As Specter has evolved, even more performance tricks have been added. See the wiki for an overview.