Closures em Clojure


Uma closure (clausura) é uma função que “captura” o ambiente onde foi criada, mantendo acesso às variáveis do seu contexto original.

NOTE

Elas são geradas através da Forma especial fn.

Uma closure “fecha” (closes over) o escopo circundante, capturando valores de símbolos como parâmetros de funções ou definições de um let.

A característica fundamental é a persistência: os valores capturados permanecem disponíveis mesmo após o escopo léxico original ter sido encerrado ou saído de execução.

Isso permite a criação de funções altamente dinâmicas que carregam consigo um “estado” ou configuração inicial.

(defn criar-calculadora [taxa]
  (fn [valor-base]
    (* valor-base (+ 1 taxa))))
 
(def calcular-iva-portugal (criar-calculadora 0.23))
(def calcular-iss-brasil    (criar-calculadora 0.05))
 
(calcular-iva-portugal 100) ; Retorna 123.0
(calcular-iss-brasil 100)    ; Retorna 105.0

Neste exemplo, utilizamos a forma especial fn para capturar uma taxa de imposto específica e criar funções que já “sabem” qual taxa aplicar, sem precisar recebê-la novamente em cada chamada.

Referências


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

https://pt.stackoverflow.com/questions/1859/como-funcionam-closures-em-javascript