LISP

Grupo responsável:

  • Yuri Marini Peter
  • Mohammad Basciri Nimer Hammad
  • Marcelo Zschornack

Introdução

Lisp é uma família de linguagens de programação multi-paradigma (funcional, procedural e orientada a objetos) e é muito utilizada em Inteligência Artificial. Foi criada em 1958 e influenciou linguagens como Python, Perl, Smalltalk, Ruby e Forth.

História

Por volta de 1956, John McCarthy, durante um projeto de pesquisa em Inteligência Artificial no MIT (Instituto de Tecnologia de Massachusetts), teve as primeiras idéias para uma linguagem de programação em que fosse possível utilizar exlusivamente funções matemáticas como estruturas de dados (idéia sustentanda com base no Cálculo Lambda). Por isso, se diz que Lisp é uma linguagem formal matemática.

Sua primeira implementação ocorreu em 1958 e ela se tornou a principal linguagem na comunidade de inteligência artificial nos anos de 1970 e 1980. O nome Lisp é acrônimo para “List Processing”, visto que as listas eram as estruturas de dados fundamentais da linguagem.

Dialetos

Obviamente, as versões de Lisp que usamos hoje não são as mesmas usadas por volta de 1960. A sua fácil utilização e adaptação, junto com sua origem acadêmica, facilitou o surgimento de dezenas de versões ao passar dos anos.

Seguem abaixo alguns dos dialetos conhecidos:

  • Lisp 1 – Primeira implementação da linguagem, em 1958.
  • Lisp 1.5 – Primeira versão amplamente distribuída, utilizada entre 1960 e 1965.
  • Stanford Lisp 1.6 – Desenvolvida pela Stanford AI Lab, foi a sucessora do Lisp 1.5, mas se tornou obsoleta com a chegada do Maclisp e InterLisp, estes que foram os predominantes nos anos 70.
  • Maclisp – Aperfeiçoou a noção de variáveis especiais e o suporte a erros. Enfatizava a velocidade de execução.
  • InterLisp - Introduziu muitas idéias na metodologia do ambiente de execução.
  • Standard Lisp – Tentativa de padronização feita por volta de 1969.
  • Portable Standard Lisp – Nova implementação do Standard Lisp que, devido à grande portabilidade, foi utilizada até a década de 80.
  • FranzLisp, ZetaLisp, LeLisp, Scheme, T, Nil, XLisp, AutoLisp…

O surgimento dessa grande quantidade de dialetos tornou difícil a livre comunicação entre a comunidade Lisp. Em 1981, os grupos de pesquisa Symbolics, NIL, S1 e SPICE reuniram-se, então, para criar um padrão que facilitasse a troca de idéias e programas. Foi criado o Common Lisp (que só não se chamou Standard Lisp porque já havia sido criada), a qual deveria suportar grande parte das capacidades das demais versões.

Características

Lisp é uma linguagem fracamente tipada se comparada com linguagens funcionais mais atuais. Isso causa complicações, visto que as operações de acesso às suas estruturas de dados são tratadas como funções.

Ainda assim, ela permite ao programador extender e adaptar a linguagem às suas necessidades, incorporando, até mesmo, outros paradigmas de programação (orientada a objetos, etc.) sem que a linguagem anterior seja deixada para trás, como ocorre nas outras linguagens.

O nível de abstração é alto, especialmente quando se utiliza funções. Isso esconde muitos processos da programação e diminui a chance de ocorrência de muitas classes de erro.

A linguagem é interpretada: o usuário digita uma expressão, de acordo com sua linguagem formal, e recebe a resposta. Desta forma, Lisp pode ser visto como uma calculadora, que ao invés de avaliar expressões aritméticas avalia expressões simbólicas. Desta forma, cada programa em LISP é uma expressão. Essa interatividade facilita muito para o programador, pois cada trecho de programa pode ser compilado e testado independentemente dos demais.

Há dois tipos de dados: átomos e listas. Um átomo pode ser numério ou alfanumérico. Uma lista é uma associação de átomos ou outras listas, e chamamos de elementos cada um dos itens de uma lista.

Exemplos de Programas

Vale comentar que Lisp usa a notação polonesa (ou notação prefixa) em suas expressões, onde o operador vem antes dos operandos, e não entre eles, como de costume.

Seguem abaixo alguns exemplos de programas em Common Lisp:

Hello World

;;; Exemplo de comentário.
 
(defun helloworld ()
  (print "Hello World!")
)

Fatorial

(defun fatorial (n)
   (if (<= n 1)
       1
       (* n (fatorial (- n 1)))))
;;; Perceba que a função é recursiva e o operador vem antes dos operandos.

Bibliografia e Links

 
lisp-1-trabalho.txt · Last modified: 2012/03/18 22:34 by clp · [Old revisions]