domingo, 4 de outubro de 2009

Scheme - Uma linguagem folclórica


Scheme é um dialeto da famosíssima linguagem LISP, criada pelo cientista da computação John McCarthy, inspirada pela teoria matemática chamada de cálculo lambda. LISP também foi amplamente utilizada em pesquisas na área de inteligência artificial e foi provavelmente dela que surgiu o conceito de lista encadeada.

Eu não faço a menor idéia de como é hoje a linguagem LISP para quem quer trabalhar como programador, mas eu resolvi aprender essa linguagem devido ao fato dela ser uma linguagem que implementa muito bem o paradigma de programação funcional e como até hoje eu só aprendi um pouco de linguagens estruturadas, como a linguagem C, e um pouco de linguagens orientadas a objetos, como Python e Ruby, resolvi conhecer qualé a desse paradigma. Tá, eu sei que Python e Ruby são multi paradigma, mas elas dão ênfase na programação orientada a objetos!

Mas, voltando ao assunto original, como não quero trabalhar como programador, acho que posso me dar ao luxo de aprender qualquer tipo de linguagem, por menos prática que ela seja, apenas pelo prazer de aprender. E um outro motivo para eu querer aprender Scheme é que o Emacs usa elisp, mais um dos dialetos de LISP, e aparentemente tem uma galera querendo fazer o Emacs funcionar também com Scheme. Só que não faço a menor idéia de como é a compatibilidade do Scheme com Elisp...

Obviamente, Emacs também é uma excelente ferramenta para programar em Scheme! Ouvi falar que muita gente, mesmo os defensores da seita do VI, largam seus editores/IDEs/SOs favoritos apenas para programar Scheme no Emacs!

Aprendo Scheme por causa do Emacs, e aprendo Emacs por causa do Scheme, parece que caí num ciclo vicioso, mas não, eu queria aprender ambas as coisas desde o início.

Bem, deixa de enrolação, esse texto era sobre o que eu tenho feito feito para aprender Scheme, usando o Emacs e por que tudo isso é muito divertido. Então, como usar decentemente o Emacs para programar em Scheme?

A primeira coisa é decidir qual interpretador de Scheme usar, eu escolhi o Guile. O interpretador GNU Guile, não o personagem do street fighter!

Agora basta configurar o Emacs para usar o Guile, para tal, basta colocar no ~/.Emacs a seguinte linha:

(setq Scheme-program-name "guile") ;; Sonic boom!

Então basta recarregar o Emacs ou ir deixar o cursor no final da linha anterior e mandar o Emacs executar o código elisp: C-x C-e.

Agora vem a parte mais legal, que é a integração do Emacs com o interpretador guile, que funciona bem que é uma maravilha! Eu faço assim, sempre que vou estudar Scheme eu abro duas janelas no Emacs, deixo uma para escrever o código e outra com o interpretador Scheme.

Conforme eu programo, eu peço para o Emacs enviar uma linha ou um bloco de texto direto para o guile, assim eu consigo testar pedaços do programa em tempo de programação, sem ter que ficar montando um programa inteiro para só depois analisar o que um trecho de código faz.

Bem, pode ter sido confuso isso que descrevi acima, mas funciona assim, eu primeiro digito C-x C-3 para abrir uma janela nova, então vou na segunda janela, executando C-x o, nessa segunda janela eu executo o comando M-x run-Scheme e o interpretador fica rodando. Voltando para a primeira janela já podemos começar a programar, então vamos tentar digitar o mais clássicos programa de todos os tempos, um hello world em Scheme! Digite o seguinte código na janela para programar:

(display "Hello World!")

Agora, com o cursor no final da string, execute C-x C-e, e tcharam! o Emacs enviou a linha inteira para o interpretador, que, err, interpretou o código e mostrou a saída! Bem legal, hein?

E ainda dá para fazer mais, dá para enviar um bloco de texto inteiro para o interpretador, e é bem fácil, primeiro você escreve um código que tem mais de uma linha, então seleciona o bloco e em seguida você roda C-x C-r. Aqui vai um exemplo de código para você testar:

(define (factorial n)
  (if (= n 1)
    1
    (* n (factorial (- n 1)))))

(factorial 30)

Se você não se lembra como se seleciona um trecho de código usando Emacs isso é realmente muito simples, basta apertar M-x espace com o cursor onde você quer que o bloco comece, então movimente o cursor até o final do bloco e toda a região delimitada pela posição atual do cursor e a parte onde o início do bloco foi marcado. Agora é só executar C-c C-r.

Espero que as informações acima sirvam para quem está começando com Scheme e queira usar Emacs para programar e, caso você comece a estudar Scheme também, fale comigo e podemos aprender um pouco juntos, discutir umas idéias, trocar uns códigos e coisas assim. Se tiver curiosidade, deixe um comentário ou entre em contato.