Adiar avaliação de símbolos e listas com Quote


Em Clojure (e em Lisp em geral), o comportamento padrão do compilador é tentar avaliar (evaluate) tudo o que lê. Isso significa que ele tenta resolver símbolos para encontrar seus valores correspondentes (variáveis ou funções).

O Quote (representado pelo caractere apóstrofo ') é um mecanismo especial que interrompe a avaliação. Ele diz ao Clojure: “Não tente executar ou resolver isso; trate o que vem a seguir apenas como dados brutos”.

O caso do require (Função)

A função require é uma função comum. Em Clojure, funções sempre avaliam seus argumentos antes de serem executadas.

Sem Quote: (require [clojure.string])

  • O avaliador entra no vetor.
  • Encontra o símbolo clojure.string.
  • Tenta achar uma variável com esse nome. Como a biblioteca ainda não foi carregada, ele falha: Unable to resolve symbol.

Com Quote: (require '[clojure.string])

  • O avaliador vê o '.
  • Ele para a avaliação e passa o vetor [clojure.string] contendo o símbolo bruto para a função require.
  • A função require pega esse símbolo e carrega a biblioteca correspondente.

O caso do ns (Macro)

A declaração ns, usada no topo dos arquivos, é uma Macro. Diferente das funções, as macros recebem o código sem avaliação prévia. Por isso, dentro do (:require ...) do ns, não é necessário usar o quote; a macro já sabe que deve tratar aqueles símbolos como nomes de bibliotecas, e não como variáveis.

flowchart TD
    A[Input: Símbolo 'abc'] --> B{Tem Quote?}
    
    B -- Sim 'abc --> C[Retorna o Símbolo Literal]
    C --> D[Dado Bruto: abc]
    
    B -- Não abc --> E[Busca no Ambiente]
    E --> F{Existe?}
    F -- Sim --> G[Retorna o Valor da Variável]
    F -- Não --> H[Erro: Unable to resolve symbol]

Referências