Esta é a apresentação que eu dei no trabalho para introduzir Clojure.
Clojure, devemos usá-lo?
Objetivos
Tenho três objetivos distintos para esta conversa. Eu gostaria de convencer os programadores aqui a escrever seu próximo trabalho em Clojure. Gostaria de convencer os gestores presentes que seus programadores serão muito mais eficazes escrevendo em Clojure. Gostaria de convencer aqueles que cuidam do código em execução que Clojure será no mínimo tão estável quanto os serviços Java que possuímos no momento.
Vou fazer isso primeiro introduzindo a linguagem Clojure, explicar o que é, e por que eu gosto dela. Vou então te mostrar um pequeno exemplo de um serviço Clojure em execução. É evidente que só vou ser capaz mostrar superficialmente tudo o que Clojure é, então também espero que depois desta conversa você queira descobrir um pouco mais. Vou te dar alguns indicadores para isso.
Finalmente, gostaria de deixar um tempo para discussão.
O que é Clojure?
Clojure é uma linguagem dinâmica e funcional, que é executada no Java Virtual Machine.
Dinâmica
Isso significa que é possível fazer as coisas no tempo de execução que só são possíveis em tempo de compilação em outras linguagens. Python e Ruby são linguagens dinâmicas que você deve conhecer.
Funcional
Em poucas palavras, uma linguagem funcional é aquela que enfatiza a avaliação de funções e evita estado. Isso está em contraste com a programação imperativa, que enfatiza mudanças no estado.
Em linguagem funcional, funções são cidadãos de primeira classe; você pode usá-los onde quer que você usaria um variável. Eles são os blocos básicos de construção da linguagem: você pode criá-los, adicioná-los a listas, devolvê-los de outras funções, e passá-los como argumentos de funções. Na verdade, há um nome especial para funções que recebem outras funções como argumentos: eles são chamados de funções de ordem superior. Elas são muito importantes em Clojure.
Roda no JVM
Clojure é uma linguagem compilada. Ela compila para bytecode JVM da mesma maneira que o Java faz.
Por que é interessante?
Por que eu acho que vale a pena meia hora de seu tempo para me ouvir falar sobre essa linguagem? Até certo ponto, acho que você tem que começar a escrever programas com Clojure para perceber como é legal, mas eu gostaria de enumerar algumas razões pelas quais acho a linguagem interessante.
Sucinta
Programas escritos em Clojure são pequenos. Muito pequenos. É incrível o quanto você pode empacotar em algumas linhas de código.
Quem se importa? Por que eu acho que isso merece ser mencionado?
Considere escrita e manutenção de programas. Se todo o resto é igual, vai demorar menos tempo para escrever um programa em uma linguagem sucinta do que naquela que não é.
O custo de um programa é esmagadoramente dominado pelo esforço de manutenção. Um pequeno programa é mais fácil de ler, mais fácil de refatorar e mais fácil de manter. Há uma grande vantagem em ser capaz de ter mais de um serviço na sua tela ao mesmo tempo. É ótimo para ser capaz de raciocinar sobre os aspectos de um programa que está todo na tela ao mesmo tempo.
Considerando que acho a simplicidade um fator importante, quão sucinto é o Clojure? Decidi medir.
Durante algumas noites, eu reescrevi o serviço de traduções em Clojure. Neil queria ver o que era o estardalhaço em torno de Clojure, então ele reescreveu o serviço de log. Eu contei todas as linhas do programa.
Aqui estão os resultados. Não, eu não me esqueci de colocar Clojure no gráfico. É assim tão pequeno. Eu não incluí quaisquer testes, unitários, ou de aceitação. Há um pequeno aviso: nós dois utilizamos Mongo em vez de MySQL. Não acho que explica a grande diferença.
Se também incluíssemos a configuração XML, olha como seria. Existem algumas de centenas de linhas a mais.
Perl
Perl também é uma linguagem sucinta. É mais ou menos assim. Não consigo lembrar o que este trecho de código faz. Não é muito claro. Posso prometer a você que Clojure não é assim.
sort{($a=~/([aeoui])/)[0]cmp($b=~/([aeiou])/)[0]}@_} 1234567890123456789012345678901234567890123456890123
Simples
Eu digo isso no sentido Rich Hickey da palavra. Rich Hickey é o criador da Clojure, e ele a projetou para ser simples. Se você não já tiver visto, eu recomendo assistir à palestra de Rich, “Simple Made Easy”. Se você já viu, eu recomendo assistir novamente!
Clojure possui alguns tipos primitivos: mapas, listas, vetores, conjuntos e funções. É possível compor os tipos primitivos em estruturas que representam os dados que você está processando.
Clojure possui um número muito grande de funções que operam nos tipos básicos.
Em Java ou C #, é necessário criar um tipo para armazenar dados. Para usar os dados, você deve escrever um método que trabalhe com uma instância do tipo. Em Clojure, você verá que a maioria das coisas que você quer fazer são composições das principais funções e tipos de dados.
Alan Perlis disse: ‘É melhor ter 100 funções que operam sobre uma estrutura de dados do que 10 funções que operam em 10 estruturas de dados’.
Clojure reflete isso.
Java Interop
Como eu disse anteriormente, Clojure é roda na JVM. Isso é importante porque ela permite uma característica importante. Clojure pode facilmente usar classes Java. Você pode criar instâncias de classes, chamar métodos estáticos e implementar interfaces com muita facilidade. Isso pode ser útil se você encontrar uma biblioteca que existe para Java para o qual não há um equivalente em Clojure. É muito fácil para envolvê-lo e usá-lo em seu programa.
O inverso também é verdadeiro. É possível escrever um programa em Clojure e chamá-lo do Java. Eu não tentei, nem posso pensar em uma razão para fazê-lo no momento.
Temos tudo de Java à nossa disposição como programadores Clojure.
Jetty e Jboss
Podemos usar aplicativos Clojure da mesma maneira que usamos nossos aplicativos Java. Podemos optar por criar tanto um war ou um jar. O war vai trabalhar com Jetty e JBoss de forma idêntica ao nosso Java wars. Criei um serviço que tem um método principal que executa Jetty e elimina o serviço dentro dele. Não há nenhuma diferença aqui. É apenas um aplicativo que roda em JVM.
Recrutamento
Eu não tinha pensado nisso até Ben mencionar isso para mim. Ao usar empolgantes novas tecnologias, seremos capazes de atrair desenvolvedores que estão interessados em trabalhar com novas tecnologias interessantes.
Multi-threaded
Clojure torna muito mais fácil escrever programas multi-threaded corretos. Nossos servlets são multi-threaded, e eu tive que resolver alguns problemas que foram causados por threading pobres. Ao usar Clojure, esperemos tornar isso mais fácil.
Mostre-me os parênteses
Eu gostaria de te mostrar a sintaxe da Clojure. Em Java você escreve method(); o equivalente em Clojure é (funtion). Se você quiser passar um argumento, é method(arg) e (function arg). Se você desejar mais do que um argumento em Clojure, você precisa separar os argumentos com espaços em branco: (function arg1 arg2 arg3). As vírgulas são whitesapce, de modo que (function arg1, arg2, arg3) é válida, mas não idiomática.
Criar mapas em Clojure usando chaves: {“key” “value”} é um mapa entre a chave “key” e o valor “value”. É mais comum usar palavras-chave Clojure como a chave em um mapa. Palavras-chave são identificadores simbólicos que avaliam a si mesmos. {:key1 “value1” :key2 “value2”} é um mapa com duas chaves de palavras-chave e dois valores.
Qualquer pessoa que se queixa de que há suportes demais em Clojure nota que o exemplo Java tem quatro divisas, quatro parênteses e quatro chaves, em comparação com os dois parênteses do Clojure e duas chaves.
Exemplo
Eu gostaria de mostrar um exemplo de um serviço Clojure.
(ns example.core (:use [compojure.core] [compojure.handler])) (defroutes app (GET "/" [] "Hello World!"))
É possível ver no topo o equivalente para importar declarações. Esse serviço aceita chamadas para o recurso de raiz e responde com a string “Hello World!”. Tomara que isso não só o convença da simplicidade da linguagem, mas também sua legibilidade.
Digamos que percebi que não quero dizer “Hello World!”. Em vez disso, decidi que eu quero dizer “Oi!”. (?) É fácil fazer essa alteração, e veja: eu não tenho que recompilar ou reimplementar, a mudança é visível imediatamente. Há um observador que percebe quando há alterações de arquivos, e o recarrega. A capacidade de recarregar dessa forma é um recurso da Clojure do qual a biblioteca HTTP que estou usando tira vantagem, não um da biblioteca HTTP.
Quer saber mais?
Se você quiser conhecer mais profundamente, eu recomendo que compre Clojure Programming ou The Joy Of Clojure. Ambos são ótimos livros, mas muito diferentes.
Clojure Programming começa como uma introdução suave e dá uma visão abrangente da linguagem. The Joy Of Clojure tem sido descrito como uma mangueira de incêndio para Clojure. Está cheio de grandes exemplos de uma linguagem tão poderosa, mas, novatos, tomem cuidado!
?
Texto original disponível em http://www.andrewhjon.es/142343729