Hierarquia de escopo em funções no Clojure
Em Clojure, tanto a definição de funções quanto o let são responsáveis pela criação de escopos léxicos interconectados.
Ao definir uma função com defn, cria-se um escopo para os parâmetros da função, que têm significado apenas dentro do corpo dessa função.
Um bloco let inserido dentro de uma função cria um sub-escopo ainda mais restrito.
graph TD subgraph "Escopo Global (Namespace)" A[Símbolos Globais] subgraph "Escopo da Função (defn)" B[Parâmetros da Função] subgraph "Escopo Local (let)" C[Bindings Locais] end end end C -.-> |Precedência| B B -.-> |Precedência| A
Exemplo de aninhamento:
No código (defn messenger [msg] (let [a 7] ...)), o símbolo msg é válido em toda a função, mas o símbolo a é restrito apenas ao bloco let.