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.

Referências


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