Forma especial fn
A forma fn é utilizada para criar objetos de função, sendo a base para a existência de funções e closures.
Diferente de definições de funções, que define um nome global, fn foca na criação da lógica funcional e na captura de escopo.
Quando fn é declarada dentro de outra função, ela automaticamente captura os bindings disponíveis naquele momento.
Exemplo aplicando no factory method:
(defn messenger-builder [greeting]
(fn [who] (println greeting who)))
No exemplo acima, o valor passado para greeting é “congelado” dentro da função anônima retornada.