Introdução

Clojure é uma linguagem de programação dinâmica e de uso geral, combinando a acessibilidade e o desenvolvimento interativo de uma linguagem de script com uma infraestrutura eficiente e robusta para programação multithread. Clojure é uma linguagem compilada, mas permanece completamente dinâmica, ou seja, todos os recursos suportados por Clojure são suportados em tempo de execução. Clojure fornece acesso fácil às estruturas Java, com dicas de tipo opcionais e inferência de tipo, para garantir que chamadas para Java possam evitar reflexão..

Clojure é um dialeto do Lisp e compartilha com o Lisp a filosofia code-as-data e um poderoso sistema de macro. Clojure é predominantemente uma linguagem de programação funcional e apresenta um rico conjunto de estruturas de dados persistentes e imutáveis. Quando o estado mutável é necessário, o Clojure oferece um sistema de memória transacional de software e um sistema de agente reativo que garante designs limpos, corretos e multithread.

História

Rich Hickey é o criador da linguagem de programação Clojure. Hickey gastou cerca de 2 anos e meio trabalhando na linguagem antes de lançá-la publicamente, muito desse tempo trabalhando exclusivamente, sem nenhum financiamento externo. No final deste período Hickey enviou um e-mail anunciando a linguagem a alguns amigos na comunidade Common Lisp.

O processo de desenvolvimento é voltado para a comunidade e o desenvolvimento é gerenciado no site da comunidade Clojure. O site contém documentos de planeamento e um rastreador de problemas onde bugs podem ser reportados.

Discussões gerais sobre o desenvolvimento acontecem no Google Groups (em inglês). Enquanto qualquer um pode enviar relatórios de erros e idéias, para contribuir com correções é preciso assinar o acordo de contribuição Clojure, os bilhetes JIRA são processados por uma equipe de triagem e, finalmente, Rich Hickey aprova as alterações.

Programação Funcional

Clojure é uma linguagem de propósito geral, dinamicamente tipada e predominantemente funcional. Isto significa que ela utiliza funções como base para a realização de operações computacionais, evitando, na medida do possível, alterações de estado e dados mutáveis.

Existem diversos artigos que explicam muito bem os fundamentos da programação funcional. Sendo assim, ao invés de explicar a teoria por trás do paradigma, vou manter o foco em demonstrar aplicações práticas em Clojure em meus próximos artigos, sem deixar de mencionar os principais pontos da linguagem.

No que diz respeito à gerenciamento de estado e mutabilidade, a linguagem oferece um conjunto de estrutura de dados persistentes e imutáveis que facilitam na construção de softwares mais robustos e menos suscetíveis a falhas, principalmente em aplicações que necessitam de processamento concorrente.

Simplicidade

Lisp (List Processing), é uma família de linguagens de programação que se baseia em um modelo computacional chamado Cálculo Lambda. Clojure, por ser um dialeto de Lisp, herda as características inerentes desse tipo de linguagem, como por exemplo:

- Notação prefixada com parênteses: Uma soma de dois números, por exemplo, é representada desta forma (+ 1 2), ao invés da notação infixa utilizada na aritmética, 1 + 2;

- Expressões aninhadas: Uma soma seguida de uma multiplicação é representada desta forma (* 3 (+ 1 2)), ao invés de 3 * (1 + 2). Caso adicionássemos mais uma operação de subtração, nossa expressão ficaria desta forma (- 2 (* 3 (+ 1 2))), e o Clojure continuaria a avaliação das expressões de "dentro pra fora". Apesar de inicialmente isto não parecer nem um pouco atrativo, existem algumas vantagens por trás deste modelo;

- "Code-as-data" e "homoiconicity": A sintaxe de um Lisp é construída inteiramente a partir de estruturas de dados que a própria linguagem pode gerar e manipular. Sendo assim, a leitura de um código fonte de um Lisp é essencialmente a sua própria representação interna;

- Suporte a macros: a característica anterior é, e não somente é, a base do sistema de macros presente nos Lisps, que permite a extensão da linguagem. Em resumo, macros permitem adicionar funcionalidades que não estão presentes por padrão na linguagem, justamente por esta tratar código como dado.

Essas características fazem com que a linguagem praticamente não possua sintaxe, seja extremamente expressiva, concisa e simples.

Plataforma

Clojure foi criado para ser uma hosted language. Atualmente, é possível compilar código Clojure para as seguintes plataformas:

- Java Virtual Machine (plataforma padrão);

- Javascript (Clojurescript);

- CLR (.Net Framework);

- Código nativo utilizando GraalVM;

- Entre outras plataformas não-oficiais, como por exemplo o Clojurerl (Erlang).

Esta característica permite a utilização do vasto ecossistema de bibliotecas existente nas plataformas citadas através da interoperabilidade de código e também, no proveito da estabilidade e maturidade que estas plataformas possuem.

Outro ponto importante, é que isso facilita na portabilidade e compartilhamento de código. É possível criar uma aplicação web inteira utilizando apenas Clojure + Clojurescript, podendo até compartilhar funções que não sejam restritas à suas plataformas específicas.

REPL

O REPL (Read Eval Print Loop), é uma ferramenta que permite que vc interaja diretamente com a linguagem enquanto desenvolve, avaliando o código, printando, criando loops e etc, sem precisar de fato compilar e executar o código para fazer alguma experimentação ou testar se seu código se comporta como deveria.

Geralmente, programadores Clojure seguem a estratégia de desenvolvimento orientado a REPL para receber feedbacks constantes durante a construção de seus códigos, melhorando a sua produtividade drasticamente.

Contact

Elements

Text

This is bold and this is strong. This is italic and this is emphasized. This is superscript text and this is subscript text. This is underlined and this is code: for (;;) { ... }. Finally, this is a link.


Heading Level 2

Heading Level 3

Heading Level 4

Heading Level 5
Heading Level 6

Blockquote

Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan faucibus. Vestibulum ante ipsum primis in faucibus lorem ipsum dolor sit amet nullam adipiscing eu felis.

Preformatted

i = 0;
while (!deck.isInOrder()) {
    print 'Iteration ' + i;
    deck.shuffle();
    i++;
}
print 'It took ' + i + ' iterations to sort the deck.';

Lists

Unordered

  • Dolor pulvinar etiam.
  • Sagittis adipiscing.
  • Felis enim feugiat.

Alternate

  • Dolor pulvinar etiam.
  • Sagittis adipiscing.
  • Felis enim feugiat.

Ordered

  1. Dolor pulvinar etiam.
  2. Etiam vel felis viverra.
  3. Felis enim feugiat.
  4. Dolor pulvinar etiam.
  5. Etiam vel felis lorem.
  6. Felis enim et feugiat.

Actions

Table

Default

Name Description Price
Item One Ante turpis integer aliquet porttitor. 29.99
Item Two Vis ac commodo adipiscing arcu aliquet. 19.99
Item Three Morbi faucibus arcu accumsan lorem. 29.99
Item Four Vitae integer tempus condimentum. 19.99
Item Five Ante turpis integer aliquet porttitor. 29.99
100.00

Alternate

Name Description Price
Item One Ante turpis integer aliquet porttitor. 29.99
Item Two Vis ac commodo adipiscing arcu aliquet. 19.99
Item Three Morbi faucibus arcu accumsan lorem. 29.99
Item Four Vitae integer tempus condimentum. 19.99
Item Five Ante turpis integer aliquet porttitor. 29.99
100.00

Buttons

  • Disabled
  • Disabled