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.