O que tornou o Lisp especial

" A melhor linguagem de programação já criada "
- Alan Kay, "no Lisp"



Quando McCarthy desenvolveu o Lisp no final da década de 1950, ele era radicalmente diferente dos idiomas existentes, o mais importante deles era o Fortran .

O Lisp implementou nove novas idéias:

1. Condicionais . Instruções condicionais são uma construção if-then-else. Agora nós os tomamos como garantidos. Eles foram inventados por McCarthy durante o desenvolvimento do Lisp. (Na época, o Fortran tinha apenas Goto declarações que estavam intimamente relacionadas às instruções de ramificação no hardware subjacente.) McCarthy, enquanto no comitê de Algol, fez declarações condicionais em Algol, de onde elas se espalharam para outros idiomas.

2. Tipos de funções (um tipo de função) . No Lisp, funções são objetos da primeira classe - são um tipo de dados, como números, strings, etc., e têm 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á-lo. (Isso possivelmente está 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 indicadores eficientes. Os valores são o que os tipos têm, não as variáveis, e atribuir ou vincular variáveis ​​significa copiar ponteiros, não o que eles apontam.

5. coleta de lixo .

6. Programas são compostos de expressões (Programas compostos de expressões) . Programas Lisp são árvores de expressão, cada uma das quais retorna um valor. (Algumas expressões Lisp podem retornar vários valores.) Isso contrasta com o Fortran e muitas outras linguagens de sucesso que distinguem entre "expressões" e "declarações".

Era natural ter essa diferença no Fortran porque o idioma era linearmente orientado (não é surpreendente para um idioma no qual o formato de entrada era um cartão perfurado). Você não pode ter instruções aninhadas. E enquanto você precisava de expressões matemáticas para funcionar, não havia sentido em forçar outra pessoa a retornar um valor, porque talvez não houvesse algo que estivesse esperando por um retorno.

As restrições foram levantadas com o advento das linguagens estruturadas em bloco, mas já era tarde demais. A distinção entre expressões e instruções já foi corrigida. Passou de Fortran a Algol e depois a seus descendentes.

Quando a linguagem é composta inteiramente de expressões, você pode fazer expressões como desejar. Você pode escrever (usando a sintaxe do 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 seqüências de caracteres; nesse caso, você pode verificar a igualdade comparando os ponteiros.

8. Uma notação para código usando árvores de caracteres.

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

A execução de 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 o uso do Lisp como uma linguagem de extensão em programas como o Emacs; e, finalmente, a leitura em tempo de execução permite que os programas interajam usando expressões s, uma idéia recentemente reinventada em XML.

Conclusão


Quando o Lisp acabou de ser inventado, todas essas idéias estavam muito longe das práticas usuais de programação ditadas pelo hardware disponível no final da década de 1950.

Com o tempo, o idioma padrão, incorporado no sucesso dos idiomas populares, evoluiu gradualmente para o Lisp. Os pontos 1 a 5 são agora generalizados. O ponto 6 começa a aparecer no mainstream. No Python, de alguma forma, existe o item 7, embora não haja sintaxe adequada. A cláusula 8, que (com a cláusula 9) possibilita macros no Lisp, ainda está presente no Lisp, talvez porque (a) exija esses colchetes ou algo igualmente ruim e (b) se se você adicionar esse último aumento de poder, não poderá mais alegar ter inventado um novo idioma, mas apenas desenvolvido um novo dialeto do Lisp; -)

Embora isso seja útil para programadores modernos, é estranho descrever o Lisp em termos de como ele difere dos truques aleatórios usados ​​em outros idiomas. Talvez não fosse isso que McCarthy estava pensando. O Lisp não foi projetado para corrigir erros do Fortran; parecia mais um subproduto de uma tentativa de axiomatizar cálculos .

Source: https://habr.com/ru/post/pt476994/


All Articles