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!

Where Am I?

You are currently browsing the Clojure category at Superfície Reflexiva.