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.

Referências


https://clojure.org/guides/learn/functions#_closures