O que é Lisp

Vamos ver um tipo de linguagem funcional que é muito útil no campo da Inteligência Artificial: Lisp.

Por Miguel Angel Alvarez - Tradução de JML


Publicado em: 03/11/04

Valorize este artigo:
Um pouco de história
  • 60. McCarthy no MIT.
  • Muito usado em IA.
  • Em LISP a recursão se emprega muitas vezes como estrutura de controle, o que resta eficiência às execuções.
  • As últimas versões de LISP incluem uma re-colheita de lixo.
Perspectiva da linguagem

  • Interativa (usualmente)
  • Os dados em LISP são muito restringidos:
    • Átomos literais (símbolos)
    • Átomos numéricos
  • A estrutura de dados básica é a lista. Incluem primitivas para sua manipulação.
  • Os comentários começam por ';'
  • Os parâmetros de função vão todos por valor ou por referência, segundo a classificação da função.
  • LISP é interpretado e usa uma estrutura de gestão de armazenamento com colheita de lixo como armazenamento primário de lixo para dados e programas.
Objetos de dados

  • Tipos de dados primitivos: átomos. Cada átomo tem uma lista de propriedades associada, acessível através do ponteiro que armazena o nome do átomo.

  • Não se distinguem maiúsculas e minúsculas para identificadores.
  • Tipos de dados estruturados: listas. Têm associado um ponteiro ao primeiro elemento (car) e outro ao elemento seguinte (cdr). Uma lista vazia aponta a nil.
    Para a atribuição se utiliza setq(x val).
  • Representação e armazenamento.
    • Cada descritor de um objeto de dados proporciona tipo e atributos.
    • Nos dados estruturados (listas) têm-se somente ponteiros a primeiro e ao seguinte.
Controle de seqüência

  • O tradutor LISP é uma função read() que toma a fonte do arquivo e o interpreta.
  • A execução do programa consiste na avaliação das funções contidas no mesmo.
  • Expressões:
    • Condicional
    • Operações sobre átomos (em pré-ordem): +, -, *, /
    • Operações sobre listas: cons, car, cdr, list, replace, null, equal.
    • Operações sobre propriedades: put, get.
    • Enunciados: prog() para execução seqüencial.
    • Entrada e saída: open(), read(), print().
    • Definição de funções: defun, define.
Gestão de subprogramas

  • Três classes de funções:
    • Função interpretada, em forma de estrutura de listas. Primitivas eval e apply.
    • Função compilada, compiladas em um bloco de código máquina que pode ser executado pelo intérprete do hardware.
    • Macro, declara-se com define. É simplesmente uma função ordinária em LISP. Pode ser interpretada e compilada.
Gestão de armazenamento

  • Usa um gerenciamento dinâmico de memória, que maneja unidades de uma palavra de tamanho fixo usando uma lista de espaços livres e uma colheita de lixo.
  • Meio de referência:
    • Local, é o que se dá nas listas, como associações de átomos relacionados de uma determinada maneira.
    • Global ou comum, consegue-se mediante associação de um átomo com uma propriedade do mesmo que contém um ponteiro ao dado referenciado. Usa-se set e setq.
  • Passo de parâmetros:
    • Transmissão por valor, consiste em avaliar as expressões de uma lista de parâmetros e transmitir os valores resultantes.
    • Transmissão por nome, transmitir as expressões da lista de parâmetros sem avaliar, e deixar que a função chamada os avalie usando eval. Em funções macro a transmissão por nome é a norma. Para funções lambda pode-se especificar a transmissão por nome usando nlambda, no lugar de lambda.
Funções em Lisp

  • Funções normais, são as que se costumam incluir nas implementações de LISP (ver o manual em cada caso).
  • Funções de lista, para manipulação de listas:
    • car L, devolve o primeiro elemento de L.
    • cdr L, devolve a fila (lista - primeiro).
    • cons x y, devolve uma lista formada por x e y.
    • list x y z, devolve a lista (x y z).
    • quote x, não se avalia x.
  • Predicados
    • atom x, devolve True se x é um átomo.
    • numberp x, devolve True se x é um número.
    • greaterp x y, devolve True se x>y.
    • lessp x y, devolve True se x<y.
    • null x, devolve True ei x nulo.
    • and x y, devolve x and y.
    • or x y, devolve x or y.
    • not x, devolve not x.
    • eq x y, devolve True se x=y.
  • Funções aritméticas:
    • +, -, *, y /.
    • rem x y, devolve o módulo x/y (remainder).
  • Funções de entrada e saída
    • load nomearquivo, lê o arquivo e a memória.
    • print x, imprime o elemento x.
    • open nomearquivo, abre um arquivo e devolve uma principal ao mesmo.
    • read, lê do terminal um átomo.
    • help, proporciona ajuda.
    • trace, traça a função.
    • bye, termina LISP.
Abstração e encapsulamento

  • LISP, em origem, não inclui características de abstração de dados.
  • CLOS foi uma ampliação de LISP com orientação de objetos. Características:
    • Herança múltipla.
    • Funções genéricas.
    • Metaclasses e metaobjetos.
    • Técnica de criação e iniciação de objetos que permite controle do processo por parte do usuário.
Avaliação da linguagem

  • LISP evoluiu durante mais de 30 anos e se desenvolveu para a inteligência artificial, mas não é adequado para aplicações convencionais.
  • As versões compiladas são algo mais eficientes.






Usuários :    login / registro
Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato