Clojure e REPL

Clojure é um moderno dialeto LISP criado por Rich Hickey. É uma linguagem totalmente funcional, escrita para rodar em cima da JVM. Possui uma abordagem funcional, o que para quem só programou em linguagens imperativas e orientadas a objeto é um choque de realidades. Além disso, é uma linguagem recheada de parênteses.

Para executar o Clojure é necessário ter instalado e configurado no PATH a JVM 1.5 ou superior e baixar a ultima versão Stable em http://clojure.org/downloads. Após isso, descompacte o arquivo zip e execute java -jar clojure.jar. Deverá ser exibido a versão do Clojure instalada e um prompt,conforme mostrado abaixo:

1
2
Clojure 1.5.1
user=>

Esse é o REPL (Read-Eval-Print Loop), um ambiente Clojure interativo onde é possível executar e testar instruções sem que haja a necessidade de salvar o arquivo ou compilar o programa.

A forma mais simples de sair é apertando CTRL+D.

Para exemplificar tudo isso que foi dito vamos escrever no REPL o tradicional HELLO WORLD de algumas formas diferentes.

A forma mais simples:

1
2
user=> "Hello World"
"Hello World"

Ao digitar uma String no REPL, ele simplesmente retorna a String.

Outra forma é utilizar o método println:

1
2
3
user=> (println "Hello World")
Hello World
nil

Mas o que aconteceu aqui?
Nós chamamos uma instrução println, que é utilizada para imprimir valores no console. Ela executa a instrução passada e imprime o valor; nesse caso, o nosso Hello World.

Uma das características do REPL é esperar um resultado como retorno da função, e então imprimir esse valor de saída. Como o println, ele escreve diretamente o resultado, o retorno da função é nula (nil), por isso ele exibe esse valor na última linha, mas não se preocupe, esse nil só é impresso dentro do REPL.

No início do artigo, eu disse que o Clojure é executado em cima da JVM, logo é possível executar códigos Java dentro do Clojure sem maiores problemas. Nada mais justo que uma breve demonstração… Vamos escrever um código utilizando Java Swing para imprimir o Hello World em uma caixa de mensagem… Preparados para digitar? 🙂

1
2
user=> (javax.swing.JOptionPane/showMessageDialog nil "Hello World")
nil

Ok… E cadê o código??
Esta aí… 🙂
Essa linha é mais que suficiente para que o REPL exiba uma mensagem Hello World numa caixa de diálogo 🙂

Mais uma coisa… é possível utilizar o REPL como calculadora. Para isso, basta executar as operações utilizando a “notação polonesa” (a operação que será utilizada é informada antes de todo os valores, e todos os valores serão submetidos a uma determinada operação) conforme demonstrado abaixo:

1
2
3
4
5
user=> (+ 2 3)
5
user=> (+ 2 (* -1 (- 6 2)))
-2

Para entender o que aconteceu, vamos destrinchar a expressão (+ 2 (* -1 (- 6 2))).

O primeiro valor a ser validado é o que está no parênteses mais interno da expressão, ou seja (- 6 2), resultando em 4. Com isso, a expressão se torna: (+ 2 (* -1 4)).

O próximo passo é executar a expressão (* -1 4), que tem como resultado -4. Substituindo esse valor, temos: (+ 2 -4).

Com isso, chegamos no último ponto da expressão, que nos retorna o valor desejado: -2.

Dentro do REPL é possível criar funções e testá-las. Vamos dar uma melhorada no nosso “Hello World”, substituindo o World por um nome qualquer. Para isso, vamos escrever a seguinte função:

1
2
3
4
5
user=> (defn hello [n] (println "Hello," n))
#'user/hello
user=> (hello "Son Goku")
Hello, Son Goku
nil

O que nós fizemos aqui?

Criamos uma função chamada hello e passamos para ela um nome. Ela, por sua vez, executa o println para imprimir o nome, retornando nil.

Outra coisa que podemos fazer é criar funções anônimas, que são funções que não possuem nome e só existem para executar um determinado código dentro de um determinado escopo (a utilização prática desse tipo de função será explicada em outro artigo):
user=> ((fn [n] (println “Hello,” n “.Sou uma funcao anonima”)) “Son Goku”)

Para terminar, vou deixar para vocês pensarem no que acontece e no resultado deste código: ((fn [a + b] (+ b a)) 2 – 4)

Fonte: http://imasters.com.br/linguagens/clojure-e-repl/

Deixe um comentário