Clojure, Midje e Emacs

April 17th, 2011 § 0 comments § permalink

Esses dias comecei a brincar mais sério com o Clojure e decidi gastar um tempinho configurando o meu ambiente para a linguagem. Foi mais simples do que eu pensava, embora alguns passos dependam de configurações do lado do projeto também.

A primeira coisa é instalar o ambiente. Eu estava usando anteriormente uma versão solta em um diretório mas como o uso o Mac OS X, decidi usar o brew:

~$ brew install clojure clojure-contrib
~$ brew install leiningen
~$ lein plugin install swank-clojure 1.3.0

O primeiro comando instala o Clojure e algumas bibliotecas opcionais (que todo mundo usa na verdade) e o segundo instala uma das ferramentas de build mais usadas para a linguagem (que será útil depois para os projetos).

Finalmente, o último comando instala o plugin do Swank para o Clojure, para ser usado com o Slime. Isso também assume que este último esteja instalado. Caso contrário, basta seguir as instruções oficiais. Um único detalhe é que a versão do Swank usado pelo swank-clojure não gosta muito do autodoc do Slime–basta não carregá-lo (o que é padrão).

Em segundo lugar, o que precisei adicionar ao meu .emacs foi o seguinte:

(require 'clojure-mode)
(require 'midje-mode)
(require 'clojure-jump-to-file)

(add-hook 'clojure-mode-hook 
          (lambda ()
            (progn (midje-mode)
                   (paredit-mode +1)
                   (setq inferior-lisp-program "/usr/local/bin/clj"))))

(eval-after-load 'clojure-mode
  '(define-clojure-indent
    (fact 'defun)
    (facts 'defun)
    (against-background 'defun)
    (provided 0)))

O código acima assume que o diretório onde o clojure-mode e o midje-mode estão está apropriadamente adicionado as caminhos de carregamento do Emacs.

As primeiras três linhas são os requires necessários para carregar o ambiente. O midje-mode é um modo para o Midje, um framework de testes para o Clojure que me pareceu mais interessante que a opção padrão, o clojure.test.

O hook eu useu para carregar automaticamente o midje-mode em arquivos .clj para não precisar fazer uma distinção entre testes e arquivos comuns. Eu gosto de usar o paredit também mas é opcional. Finalmente, eu configuro qual é o aplicativo do Clojure em si.

O código para depois da carga do clojure-mode é usado somente para configurar indentações específicas para o Midje e é opcional também.

Para criar os projetos em si, é hora de usar o Leiningen:

~$ lein new my-project

Isso cria um diretório my-project já configurado com tudo o que é necessário para um projeto básico (com um arquivo .gitignore de bônus).

O próximo passo é configurar as dependências do Midje no arquivo project.clj:

(defproject books "1.0.0-SNAPSHOT"
  :description "My project"
  :dependencies [[org.clojure/clojure "1.2.1"]
                 [org.clojure/clojure-contrib "1.2.0"]]
  :dev-dependencies [[midje "1.1"]])

Depois disso é só usar o comando abaixo para atualizar as dependências:

~$ lein deps

É interessante também copiar a tarefa do lein que roda os comandos do Midje: é simplesmente baixar o arquivo midje.clj e copiá-lo para um diretório chamado leiningen dentro do projeto. Depois disso é possível rodar o comando lein midje para conferir os testes.

Com isso, já é possível usar lein swank para iniciar uma conexão dentro do projeto e, depois de abrir algum arquivo do mesmo no Emacs, rodar slime-connect para conectar o Emacs ao Slime. Um vídeo bom para introduação ao Midje no Emacs está disponível no YouTube. As mensagens quando um teste passa são bem divertidas. :)

Happy hacking!

The Wise Man’s Fear

April 16th, 2011 § 0 comments § permalink

Essa madrugada–não consegui parar depois de chegar na metade do livro–terminei de ler The Wise Man’s Fear, o segundo volume na trilogia The Kingkiller Chronicle de Patrick Rothfuss.

Eu já tinha mencionado o primeiro livro aqui há algum tempo como uma leitura essencial dentro do que a fantasia tem para oferecer nos últimos anos, dando um gostinho do que o livro conta: a história de Kvothe, aventureiro, arcanista e músico.

I have stolen princesses back from sleeping barrow kings. I burned down the town of Trebon. I have spent the night with Felurian and left with both my sanity and my life. I was expelled from the University at a younger age than most people are allowed in. I tread paths by moonlight that others fear to speak of during day. I have talked to Gods, loved women, and written songs that make the minstrels weep.

You may have heard of me.

Pelo pequeno trecho acima já dá para ver que Rothfuss não quer saber dos heróis usualmente hesitantes que a fantasia geralmente apresenta. Quando o primeiro livro se abre, Kvothe é o dono de uma hospedaria em uma vila, sob um outro nome, seus atos vivendo quase como uma lenda embora estejam há apenas poucos anos no passado. Sob um outro nome, ele é procurado por um cronista a quem decide contar sua história em três dias–daí o nome e formato da trilogia.

Dentro da história que ele conta, o começo já é fatídico, espelhando a história exterior: Kvothe perde toda a família em uma idade em que a maioria das outras pessoas não saberia nem ao menos conseguir comida por conta própria e isso o lança em uma caminho trágico e espetacular.

Embora os livros se passem, na maior parte, com um Kvothe adolescente, os livros não são de forma alguma fantasia juvenil. Embora Kvothe às vezes seja maduro de mais para a sua idade, Rothfuss consegue tornar isso não só aceitável como parte integrante da história, mesclando sucesso e falhas com maestria, demonstrando a profunda inteligência e profunda ingenuidade do personagem ao mesmo tempo.

Como eu não quero contar mais da história para não atrapalhar quem não leu, basta dizer que os dois livros representam o que há de melhor sendo escrito do gênero hoje. Um dos grandes méritos do livro, na minha opinião, está no passo forte e consistente de Rothfuss que consegue construir uma mitologia resistente e completa que dá ao mundo uma profundidade enorme ao mesmo tempo que não caí nos erros de outros escritores, descrevendo em excesso partes da história que são desnecessárias para a construção maior dos livros. Um belo exemplo no segundo livro é o momento em que Kvothe faz uma viagem longa e isso é resumido em meras duas páginas enquanto uma outra cena em que ele bebe com os amigos é descrita em detalhes e se prova depois essencial para a compreensão de um mistério.

Tudo isso torna quase certo o fato de que Rothfuss será capaz de terminar bem e satisfatoriamente o seu conto no próximo livro não deixando que sua série se arraste por dez, doze livros como outros autores.

Desnecessário dizer, o primeiro livro foi um enorme sucesso no ano da sua publicação e os fãs ficaram conseqüentemente ansiosos pela continuação que estava prevista para dois anos depois. Foram necessários quatro anos para o segundo livro mas a espera valeu a pena. Agora é voltar a esperar pelo terceiro e último livro que provavelmente vai demorar o mesmo tanto. É o único problema com a trilogia. :)

Nowhere Man

April 9th, 2011 § 3 comments § permalink

Hoje é dia quinze, né? Pelo menos eu acho que é. Acho que esqueci de como o tempo passa aqui na rua.

Sabe, não é como se os dias fossem iguais uns aos outros, do jeito que é pra todo mundo. Sabe quando o cara trabalha de segunda a sexta, todo dia do mesmo jeito, chega no trabalho de manhã cedo, rezando pro chefe não perceber que ele chegou atrasado, come no almoço c’os compadres no mesmo horário, naqueles botequinhos legais na esquina da firma, vai embora na mesma hora, pra pegar o trem lotado, fazer baldeação na Luz, chegar em Tucuruvi com muito esforço?

Sábado e domingo, bem, sábado e domingo são mais ou menos a mesma coisa, eu acho. Sábado é churrasco c’os amigos ou passeio no shopping. Domingo, casa da sogra, ou casa da mãe. Pelo menos é o que acho que as pessoas fazem normalmente. Tem o Jão aí que diz que é assim, ele vai pra casa da irmã todo fim de semana e é isso o que ele diz que acontece. Eu nunca fui lá, claro, mas é isso que o Jão diz que acontece.

Aqui na rua, o tempo não passa direito. Todo dia é tão diferente, todo dia é tão cheio de coisa pra fazer, diferente, que você nem repara direito. De dia, de noite, parece tudo a mesma coisa. Muda um pouco, eu acho. Muda a hora que a polícia passa aqui, muda um pouco o tanto de gente que passa por tal e tal lugar, mas nem tanto assim, sabe. Você acaba dormindo onde consegue achar um lugar pra dormir, mas isso é até tranqüilo porque sempre dá pra achar um lugar escondidinho onde ninguém pertuba você.

Você se acostuma, sabe. Vira parte da paisagem, eu acho. Tem hora qu’eu olho no olho de alguém e a pessoa meio que dá aquele pulo como se um poste de repente tivesse criado vida e falado com ela. Mas eu não ligo, não. Depois de tanto tempo, até isso pára de importar. Você vira mesmo parte da cidade, um lugar nenhum, uma pessoa nenhuma. Dá pra viver.

Cast a Spell

April 5th, 2011 § 0 comments § permalink

Meu último texto aqui no blog foi sobre como compilar o LLVM no Mac OS X. Para os curiosos que me perguntaram o motivo disso, a resposta está aqui: Spell.

Leitores antigos do blog sabem que linguagens de programação são um dos meus interesses primários dentro do campo da computação. Desde que eu comecei a programar, eu sempre brinquei com a construção de linguagens, embora até então não tivesse tomado tempo para realmente tentar fazer um esforço ponta a ponta usando tecnologia mais recente.

Com o desenvolvimento do LLVM, as coisas ficaram bem mais simples para alguém que queira construir uma linguagem e produzir algo que realmente tenha alguma utilidade prática–seja esta simplesmente para aprender alguma coisa nova ou seja para construir algo que seja realmente passível de uso em circunstâncias de produção.

Eu me interessei pelo LLVM assim que li sobre o projeto, mas até então não tivera oportunidade de usar. Spell é o meu primeiro esforço na direção, combinando o que eu aprendi sobre o assunto nos últimos tempos com a vontade de experimentar com algum um pouco mais consitente no campo que não a criação de simples VMs.

Spell não é, de forma alguma, uma linguagem para produção. Antes, é um projeto para o meu aprendizado e o de quaisquer outros interessados em ver com uma linguagem pode funcionar. Eu usei alguns atalhos–como o Treetop para fazer a análise léxica e parte da análise sintática–mas o que está no repositório deve servir com uma referência simples ao que pode ser feito em uma linguagem.

Por exemplo, Spell implementa closures e o código demonstra os trade-offs que foram feitos para fazer isso possível. Outros caminhos estão lá que eu pretendo explorar no futuro, como mecanismos similares à Spineless Tagless G-Machine (.ps) e a geração de código para garbage collection através do próprio LLVM.

De resto, construições são bem-vindas. Havendo interesse interesse em aprender também, basta fazer um fork do repositório e implementar o que quiser. Há bastante coisa com que se fuça lá–afinal de contas, lanças magias é sempre algo divertido. :)

Where am I?

You are currently viewing the archives for April, 2011 at Superfície Reflexiva.