Loading...

O QUE TORNOU O LISP DIFERENTE

Original

Dezembro de 2001 (rev. maio de 2002)

(Este artigo surgiu em resposta a algumas perguntas na lista de discussão LL1 . Agora ele está incorporado em Revenge of the Nerds .)

Quando McCarthy projetou o Lisp no final da década de 1950, foi um afastamento radical das linguagens existentes, a mais importante das quais era o Fortran .

Lisp incorporou nove novas ideias:

1. Condicionais. Um condicional é uma construção if-then-else. Nós os tomamos como garantidos agora. Eles foram inventados por McCarthy no curso do desenvolvimento do Lisp. (Fortran naquela época tinha apenas um goto condicional, baseado de perto na instrução branch no hardware subjacente.) McCarthy, que estava no comitê Algol, colocou condicionais no Algol, de onde eles se espalharam para a maioria das outras linguagens.

2. Um tipo de função. Em Lisp, funções são objetos de primeira classe-- elas são um tipo de dado assim como inteiros, strings, etc, e têm uma representação literal, podem ser armazenadas em variáveis, podem ser passadas como argumentos, e assim por diante.

3. Recursão. A recursão existia como um conceito matemático antes do Lisp, é claro, mas o Lisp foi a primeira linguagem de programação a suportá-la. (É indiscutivelmente implícito em tornar funções objetos de primeira classe.)

4. Um novo conceito de variáveis. Em Lisp, todas as variáveis são efetivamente ponteiros. Valores são o que tem tipos, não variáveis, e atribuir ou vincular variáveis significa copiar ponteiros, não o que eles apontam.

5. Coleta de lixo.

6. Programas compostos de expressões. Programas Lisp são árvores de expressões, cada uma das quais retorna um valor. (Em alguns Lisps, as expressões podem retornar vários valores.) Isso contrasta com Fortran e a maioria das linguagens subsequentes, que distinguem entre expressões e instruções.

Era natural ter essa distinção em Fortran porque (não surpreendentemente em uma linguagem onde o formato de entrada era cartões perfurados) a linguagem era orientada a linhas. Você não podia aninhar instruções. E então, enquanto você precisava de expressões para a matemática funcionar, não havia sentido em fazer qualquer outra coisa retornar um valor, porque não poderia haver nada esperando por isso.

Essa limitação desapareceu com a chegada das linguagens estruturadas em blocos, mas já era tarde demais. A distinção entre expressões e declarações estava entrincheirada. Ela se espalhou do Fortran para o Algol e daí para ambos os seus descendentes.

Quando uma linguagem é feita inteiramente de expressões, você pode compor expressões como quiser. Você pode dizer qualquer um (usando a sintaxe Arc )

(se foo (= x 1) (= x 2))

ou

(= x (se foo 1 2))

7. Um tipo de símbolo. Símbolos diferem de strings porque você pode testar igualdade comparando um ponteiro.

8. Uma notação para código usando árvores de símbolos.

9. A linguagem inteira sempre disponível. Não há distinção real entre tempo de leitura, tempo de compilação e tempo de execução. Você pode compilar ou executar código durante a leitura, ler ou executar código durante a compilação e ler ou compilar código em tempo de execução.

Executar código em tempo de leitura permite que os usuários reprogramem a sintaxe do Lisp; executar código em tempo de compilação é a base das macros; compilar em tempo de execução é a base do uso do Lisp como uma linguagem de extensão em programas como o Emacs; e ler em tempo de execução permite que os programas se comuniquem usando s-expressions, uma ideia recentemente reinventada como XML.

Quando o Lisp foi inventado, todas essas ideias estavam muito distantes da prática de programação comum, que era ditada em grande parte pelo hardware disponível no final da década de 1950.

Com o tempo, a linguagem padrão, incorporada em uma sucessão de linguagens populares, evoluiu gradualmente para Lisp. 1-5 agora são amplamente difundidas. 6 está começando a aparecer no mainstream. Python tem uma forma de 7, embora não pareça haver nenhuma sintaxe para ela. 8, que (com 9) é o que torna as macros Lisp possíveis, é até agora exclusivo para Lisp, talvez porque (a) requer esses parênteses, ou algo tão ruim quanto, e (b) se você adicionar esse incremento final de poder, você não pode mais alegar ter inventado uma nova linguagem, mas apenas ter projetado um novo dialeto de Lisp ; -)

Embora útil para programadores atuais, é estranho descrever Lisp em termos de sua variação dos expedientes aleatórios que outras linguagens adotaram. Não foi, provavelmente, assim que McCarthy pensou. Lisp não foi projetado para consertar os erros em Fortran; ele surgiu mais como o subproduto de uma tentativa de axiomatizar a computação .