Por que eu devo ler este artigo:Este artigo apresenta Clojure, uma linguagem funcional com a qual você pode criar aplicações concorrentes que rodam sobre a Máquina Virtual do Java de modo simples e elegante, e é voltado a desenvolvedores de software que tenham interesse em conhecer programação funcional, aprender novas linguagens ou precisem escrever aplicações para a máquina virtual do Java aproveitando a base de código que já existe hoje.

A linguagem Clojure foi criada por Rich Hickey e apresentada ao público pela primeira vez em 2007. Ela foi desenvolvida visando à construção de aplicações multitarefa de forma mais simples e concisa, aproveitando a maturidade da máquina virtual Java e eliminando parte da resistência das empresas por novas tecnologias, uma vez que praticamente toda a base de código existente hoje, escrita originalmente em Java, pode ser aproveitada e facilmente integrada a uma aplicação escrita em Clojure.

Por ser uma linguagem funcional, a menor unidade de trabalho passa a ser uma função. Isto significa que, enquanto em Java estamos acostumados a criar classes e objetos especializados, fazendo com que eles trabalhem em conjunto para resolver problemas, numa linguagem funcional nós criamos funções altamente especializadas que trabalham em conjunto para resolver praticamente os mesmos tipos de problemas.

Assim como numa linguagem orientada a objetos é normal que você passe objetos como parâmetros ou receba objetos como resultado, na programação funcional fazemos a mesma coisa com funções.

Outra característica que pode causar estranheza no início é que, por padrão, os valores em Clojure são imutáveis. Para quem vem do Java, é como se todos os valores fossem declarados usando a cláusula final.

Na prática isso faz com que você não tenha problemas quando duas threads precisarem acessar o mesmo valor, o que é uma das maiores dificuldades quando lidamos com aplicações concorrentes.

Clojure permite também que você altere a linguagempara que ela se adeque às suas necessidades. Isto é possível graças à criação demacros.

Criar uma macro é o equivalente a poder adicionar construções novas na linguagem. É um recurso tão poderoso que existem livros inteiros apenas sobre esse assunto.

No decorrer do artigo você vai aprender os conceitos básicos da linguagem e até mesmo a criar sua primeira aplicação.

Instalando o Clojure

A melhor ferramenta para começarmos a explorar o Clojure é oLeiningen. Esta ferramenta gerencia dependências e automatiza a compilação, execução de testes e geração de pacotes binários, além de permitir o uso de uma grande quantidade de plugins.

Se você já está familiarizado com o Maven no Java ou com o Rake no Ruby, não vai ter dificuldades em usar o Leiningen.

No site do Leiningen, indicado na seção Links, podem ser baixados os scripts de instalação para Linux/Mac e para Windows. Seguindo as instruções disponíveis, copie o script para algum diretório que esteja definido na variável de ambiente PATH e, caso você não esteja utilizando o Windows, marque o script como executável. Por fim, execute o comando a seguir, que exibe a versão atual da ferramenta:

lein -v

Nota: Para quem quiser instalar o Leiningen no Windows, crie um diretório sem espaços no nome e informe-o na variável de ambiente LEIN_HOME. Por padrão, a ferramenta é instalada no diretório do usuário, mas você não conseguiria atualizar o Leiningen para uma próxima versão por conta do diretórioDocuments and settings. Nos demais sistemas operacionais isso não acontece.

Nas primeiras vezes que o Leiningen for utilizado, será feito o download de algumas bibliotecas para seu computador, do mesmo modo que acontece com o Maven. Uma vez que determinada biblioteca seja baixada para a sua máquina, ela ficará disponível num repositório local, eliminando a necessidade de um novo download.

A versão do Leiningen empregada durante a escrita desse artigo foi a2.3.4, e esse número pode variar sem prejuízo algum ao entendimento do artigo.

Um dos principais recursos que o Leiningen oferece é chamado REPL, o qual usaremos em boa parte deste artigo. O REPL é um prompt para a linguagem no qual podemos definir valores, executar comandos e testar trechos de nossas aplicações de forma interativa. O nome REPL é um acrônimo para Read-Eval-Print-Loopou, em Português, Leia-Avalie-Imprima-Repita.

Primeiros passos

Após instalar o Leiningen, abra o seu terminal ou o prompt de comando, dependendo do sistema operacional que você esteja usando, e digite leinsem parâmetros para ver as opções disponíveis. Existem diversos plugins para o Leiningen que acrescentam itens a essa lista de opções.

Usando o Leiningen, vamos abrir o REPL para fazermos nossos primeiros experimentos com a linguagem Clojure. Para isso, devemos chamar a opção repl executando o comando a seguir:

lein repl

Em Clojure, o código fonte é formado por uma série de listas aninhadas contendo expressões delimitadas por parênteses. Estas expressões são interpretadas e executadas assim que a aplicação escrita em Clojure é executada ou quando você digita o seu código no REPL. Como em Clojure os tempos de interpretação, compilação e execução frequentemente se sobrepõem, ao contrário da linguagem Java (que tem esses passos muito bem definidos), esse conjunto de passos é chamado genericamente de avaliação.

O primeiro item de uma lista é um operador, e os demais são chamados de operandos, argumentos ou parâmetros. Essa notação, com o operador na frente dos argumentos, é chamada de pré-fixada, ou polonesa, e é uma das características que mais chama a atenção de quem está começando no Clojure.

Uma vez que o REPL esteja pronto, geralmente exibindo o texto user=>, vamos colocar a mão na massa para entendermos melhor o que foi dito até agora. Deste modo, digite o código a seguir e veja o que acontece, lembrando que o texto após o sinal ; é o resultado e não precisa ser digitado:

(+ 2 3)

; 5

O sinal de ; indica um comentário, e por não ter valor para o REPL, será utilizado para exibir os resultados das expressões, para que você possa acompanhar conforme for lendo o artigo.

Perceba que temos nesse primeiro exemplo uma expressão delimitada por parê ...

Quer ler esse conteúdo completo? Tenha acesso completo