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çãorequire. - A função
requirepega 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]