Como usar o compilador Clojure online
- Escreva ou cole código Clojure no editor. Restaurar exemplo traz de volta o programa inicial com um fatorial, uma lista ordenada de mapas,
frequenciese um pipeline com->>. - Pressione Executar ou use Ctrl + Enter (⌘ + Enter no Mac).
- O texto impresso com
printlnaparece no painel Saída. Depois da execução, o valor da última forma é impresso como=> ...na forma legível dopr-str. Se esse valor fornil, por exemplo quando o programa termina comprintln, nada extra é mostrado. Os erros são exibidos com a sua mensagem. - Escolha um limite de tempo de 5, 15 ou 60 segundos, ou pressione Parar para encerrar uma execução antes.
Na primeira execução, a página baixa o interpretador, de cerca de 1 MB. Copiar e main.cljs guardam o seu código, e A−/A+ mudam o tamanho do texto.
Tudo roda em um Web Worker no seu navegador. O seu código nunca é enviado a um servidor. O editor salva automaticamente o seu último programa no navegador, separadamente para cada compilador.
Sobre Clojure, ClojureScript e SCI
Clojure é um Lisp moderno construído em torno de estruturas de dados imutáveis e programação funcional. O Clojure original roda na Java Virtual Machine, e o ClojureScript é a versão que tem o JavaScript como alvo. Esta página usa o Scittle 0.8, que empacota o SCI, o Small Clojure Interpreter, para o navegador. O SCI interpreta o seu código diretamente com a semântica do ClojureScript, sem JVM nem ferramenta de build.
O que é compatível
- Definições e controle de fluxo:
def,defn,fne literais#(...),let,if,when,condeloop/recur. - Coleções persistentes: mapas, vetores, conjuntos e listas, keywords e desestruturação em
lete nos argumentos de funções. - Funções de sequência, incluindo
map,filter,reduce,sort-by,group-byefrequencies, além de sequências preguiçosas comorangeeiterate. - Macros de encadeamento
->e->>, e atoms para estado mutável gerenciado. - Interoperabilidade com JavaScript no estilo ClojureScript, como em
(js/Math.sqrt 16)ou(.toUpperCase "abc").
Limitações:
- Sem interoperabilidade com a JVM. Classes como
java.util.DateouThreadnão existem. - Sem Leiningen nem deps.edn. Não é possível adicionar bibliotecas externas, então só estão disponíveis o código do editor e os namespaces embutidos.
- Sem caixa de entrada e sem DOM. Defina os seus dados de teste no programa.
Exemplo prático: imutabilidade e encadeamento
(def inventory {:apples 3 :pears 0})
(def restocked (assoc inventory :pears 12))
(println inventory) ; {:apples 3, :pears 0} (inalterado)
(println restocked) ; {:apples 3, :pears 12}
(def counter (atom 0))
(dotimes [_ 5] (swap! counter inc))
(println @counter) ; 5
(->> [3 8 1 9 4]
(filter odd?)
(map #(* % 10))
(reduce +)) ; => 130
assoc retorna um novo mapa e deixa o original inalterado. Quando você precisa de um valor que muda com o tempo, guarde-o em um atom e atualize-o com swap!. A última forma é um pipeline com ->>. Ele passa o vetor por cada etapa como o último argumento, e o resultado é impresso como => 130. Use -> no lugar quando o valor deve ser o primeiro argumento, como em assoc e update em um mapa.
Diferenças em relação ao Clojure da JVM e armadilhas comuns
- Os números são números JavaScript. Com a semântica do ClojureScript, não existem razões nem inteiros grandes.
(/ 1 3)retorna0.3333333333333333, e inteiros muito grandes perdem precisão. - Não existe um tipo de caractere separado. Um literal de caractere como
\aé uma string de uma letra, então(frequencies "mississippi")tem chaves do tipo string. - A avaliação preguiçosa esconde efeitos colaterais.
(map println xs)pode não imprimir nada se o resultado nunca for usado. Usedoseqourun!para efeitos colaterais. - Sequências infinitas.
(range)eiteratenunca terminam, então sempre limite-as comtake. Se você imprimir uma sequência infinita, a execução continua até o limite de tempo interrompê-la. printlnvsprn.printlnimprime strings dentro de coleções sem aspas.prnmantém as aspas, o que deixa os dados mais fáceis de ler.
Perguntas frequentes
Isto é Clojure de verdade?
É código Clojure executado pelo SCI com a semântica do ClojureScript, não a implementação da JVM. A linguagem básica, as coleções e a biblioteca de sequências funcionam do mesmo jeito, então a maior parte do código Clojure puro roda sem alterações. A interoperabilidade com Java e o comportamento específico da JVM não funcionam.
Posso adicionar bibliotecas ou usar um arquivo de projeto?
Não. Leiningen, deps.edn e dependências do Maven não estão disponíveis. Cada execução interpreta o único arquivo do editor.
Por que o arquivo se chama main.cljs?
Porque o código roda com a semântica do ClojureScript. Você pode colar o conteúdo em um arquivo .clj ou .cljc, desde que ele não dependa da interoperabilidade com JavaScript.
Que outras linguagens posso experimentar?
O Interpretador Scheme online é outro Lisp para explorar. Para o próprio JavaScript, use o Compilador JavaScript online ou veja todos os compiladores online.
Atualizado