O que tornou o Lisp especial

«A maior linguagem de programação já criada«
- Alan Kay, "em Lisp"

O que tornou o Lisp especial

Quando McCarthy desenvolveu o Lisp no final da década de 1950, ele era radicalmente diferente das linguagens existentes, a mais importante das quais era Fortran.

Lisp introduziu nove novas ideias:

1. Condicionais. Declarações condicionais são construções if-then-else. Agora nós os consideramos garantidos. Eles eram inventado McCarthy durante o desenvolvimento do Lisp. (Na época, Fortran só tinha instruções goto, intimamente acopladas a uma instrução de ramificação no hardware subjacente.) McCarthy, enquanto estava no comitê Algol, contribuiu com condicionais para Algol, de onde elas se espalharam para outras linguagens.

2. Um tipo de função. No Lisp, funções são objetos de primeira classe - são um tipo de dados, assim como números, strings, etc., e possuem uma representação literal, podem ser armazenadas em variáveis, podem ser passadas como argumentos, etc.

3. Recursão. A recursão, é claro, existia como um conceito matemático antes do Lisp, mas o Lisp foi a primeira linguagem de programação a apoiá-la. (Isso talvez esteja implícito na criação de funções como objetos de primeira classe.)

4. Um novo conceito de variáveis. No Lisp, todas as variáveis ​​são ponteiros efetivos. Valores são o que os tipos possuem, 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 por expressões. Os programas Lisp são árvores de expressões, cada uma das quais retorna um valor. (Algumas expressões Lisp podem retornar vários valores.) Isso contrasta com Fortran e muitas outras linguagens de sucesso que distinguem entre “expressões” e “instruções”.

Era natural ter essa distinção no Fortran porque a linguagem era orientada por linhas (o que não é surpreendente para uma linguagem cujo formato de entrada era um cartão perfurado). Você não poderia ter instruções aninhadas. E enquanto você precisasse de expressões matemáticas para funcionar, não fazia sentido fazer com que qualquer outra coisa retornasse um valor, porque talvez não houvesse nada esperando para ser retornado.

As restrições foram suspensas com o advento das linguagens estruturadas em blocos, mas já era tarde demais. A distinção entre expressões e declarações já foi estabelecida. Passou de Fortran para Algol e depois para seus descendentes.

Quando uma linguagem é feita inteiramente de expressões, você pode compor expressões da maneira que quiser. Você pode escrever (usando a sintaxe Arco)

(if foo (= x 1) (= x 2))

ou

(= x (if foo 1 2))

7. Um tipo de símbolo. Os caracteres são diferentes das strings; nesse caso, você pode verificar a igualdade comparando ponteiros.

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

9. Todo o idioma está sempre disponível. Não há diferença óbvia entre tempo de leitura, tempo de compilação e tempo de execução. Você pode compilar ou executar código enquanto lê, ou ler ou executar código enquanto compila, ou ler ou compilar código enquanto ele é executado.

A execução do código durante a leitura permite aos usuários reprogramar a sintaxe do Lisp; executar código em tempo de compilação é a base para macros; a compilação em tempo de execução é a base para usar Lisp como linguagem de extensão em programas como o Emacs; e, finalmente, a leitura em tempo de execução permite que os programas se comuniquem usando expressões s, uma ideia recentemente reinventada em XML.

Conclusão

Quando o Lisp foi inventado, essas ideias estavam muito longe das práticas de programação convencionais ditadas pelo hardware disponível no final da década de 1950.

Com o tempo, a linguagem padrão, incorporada pelo sucesso das linguagens populares, evoluiu gradualmente para Lisp. Os pontos 1 a 5 são agora amplamente aceitos. O ponto 6 está começando a aparecer no mainstream. Em Python, existe uma cláusula 7 de alguma forma, embora não exista uma sintaxe adequada. O item 8, que (com o item 9) torna possíveis macros no Lisp, ainda está apenas no Lisp, provavelmente porque (a) requer esses parênteses ou algo igualmente ruim, e (b) se você adicionar este último aumento no poder, você pode não afirmam mais ter inventado uma nova linguagem, mas apenas ter desenvolvido um novo dialeto do Lisp; -)

Embora isso seja útil para programadores modernos, é estranho descrever o Lisp em termos de sua diferença em relação às técnicas aleatórias adotadas em outras linguagens. Talvez não fosse isso que McCarthy estava pensando. O Lisp não foi projetado para corrigir os erros do Fortran; apareceu mais como um subproduto da tentativa axiomatizar cálculos.

Fonte: habr.com

Adicionar um comentário