REPL: seu melhor amigo no mundo Clojure
Tags: beginners, clojure, programming, repl
Published: 2023-02-08 12:00:00

Nos textos anteriores para validar a instalação e configuração do ambiente eu comentei sobre o REPL, quando rodava o comando `clj` ou `lein repl`. Vamos então descobrir o que é e para que serve o REPL. 

## REPL
REPL (eu falo _répou_) é um acrônimo para **R**ead-**E**val-**P**rint **L**oop. Fazendo uma tradução livre seria um **laço de leitura-execução-impressão**.

É uma ferramenta de interação onde é possível executar códigos da linguagem, facilitando o desenvolvimento, uma validação de função, entre outros.
Um exemplo de REPL de javascript é o _console_ do navegador, nele você consegue escrever uma instrução em javascript, o navegador então irá: 
 - Ler a instrução que você colocou;
 - Executar a instrução;
 - Imprimir o resultado da instrução;

Depois disso ficará esperando uma nova instrução e repetirá o processo, ficando num laço eterno.
Diversas linguagens possuem isso e é uma excelente forma de começar a aprender a linguagem.

## Na prática
Abra o REPL rodando o comando `lein repl` no terminal.

> Se não tiver o Leiningen instalado, sugiro dar uma lida no [Leinigen: Configurando ambiente dev para Clojure](https://dev.to/afucher/leinigen-4akf), que lá explico passo-a-passo como instalar.

Uma vez executado, irá nos mostrar algumas informações como versão do Clojure e da _JDK_, e também sobre um servidor _nREPL_. Por enquanto podemos ignorar o _nREPL_, mas sim é possível conectar de remoto nesse REPL 🤯
![terminal com a execução do REPL](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/md3ikow63hmyf0zqi8og.png)

## Olá, mundo!
O REPL agora está parado no laço aguardando uma instrução para executar e imprimir o resultado. Vamos fazer um pequeno teste para ver como funciona.

> Por enquanto não repare na sintaxe ou qualquer aspecto da linguagem, o foco é o REPL.

Para começar que tal o famoso `Hello world!`? Para isso execute o seguinte código no REPL `(pprint "Hello world!")` e vamos analisar a saída:
```shell
user=> (println "Hello world!") #READ
Hello world!                    #EVAL
nil                             #PRINT
user=>                          #LOOP
```

É possível ver todo o laço, primeiro ele lê a entrada da nossa instrução, e em seguida executa o código que nesse caso é para imprimir o texto "Hello world!". Depois o `nil` pode ser confuso, mas é a impressão do resultado da execução, que nesse caso é nulo dado que esse é o retorno da chamada do `println`. E no final volta para o estado de esperar a próxima execução.

Agora vamos executar uma instrução que não imprima nada, como no caso anterior. Vamos somar 1 e 1 usando o código `(+ 1 1)`:

```shell
user=> (+ 1 1) #READ
2              #(EVAL) PRINT 
user=>         #LOOP
```
Nesse exemplo o passo de executar o código não aparece, pois a soma é feita em memória. Mas depois conseguimos checar que no terminal é impresso o resultado da soma `2`.

---

Eai, o que achou? O REPL é excelente para conhecer funções e estruturas de dados em Clojure. Veja a [documentação do println](https://clojuredocs.org/clojure.core/println) e tente outras funções.
Caso queira se aprofundar, existem conteúdos também sobre REPL Driven Development bem interessantes! Sugiro a palestra [REPL Driven Development, Clojure's Superpower - Sean Corfield](https://www.youtube.com/watch?v=gIoadGfm5T8) (em inglês)

Abraços, e até uma próxima!