«O maior de todos os tempos já criado linguagens de programação«
— Alan Kay, «on Lisp»

Quando McCarthy criou Lisp no final da década de 1950, ele diferia radicalmente das linguagens existentes, a mais importante das quais era .
Lisp incorporou nove novas ideias:
1. Declarações condicionais (Conditionals). As declarações condicionais são construções if-then-else. Hoje as consideramos garantidas. Elas foram por McCarthy durante o desenvolvimento do Lisp. (Fortran na época só tinha comandos goto, intimamente ligados à instrução de ramificação na máquina subjacente.) McCarthy, ao fazer parte do comitê do Algol, introduziu declarações condicionais no Algol, de onde se espalharam para outras linguagens.
2. Tipos funcionais (A function type). Em Lisp, funções são objetos de primeira classe — elas são um tipo de dado, assim como números, strings, etc., e têm uma representação literal, podendo ser armazenadas em variáveis, passadas como argumentos, etc.
3. Recursão (Recursion). A recursão, claro, existia como um conceito matemático antes do Lisp, mas Lisp foi a primeira linguagem de programação a suportá-la. (Isso é possível que seja implicado na criação de funções como objetos de primeira classe.)
4. Um novo conceito de variáveis (A new concept of variables). Em Lisp, todas as variáveis são ponteiros eficientes. Valores são o que os tipos têm, e não as variáveis, e a atribuição ou ligação de variáveis significa copiar ponteiros, e não o que eles apontam.
5. Coleta de lixo (Garbage-collection).
6. Programas compostos de expressões (Programs composed of expressions). Os programas em Lisp são árvores de expressões, cada uma das quais retorna um valor. (Algumas expressões Lisp podem retornar múltiplos valores.) Isso contrasta com Fortran e muitas outras linguagens bem-sucedidas, que fazem a distinção entre 'expressões' e 'declarações'.
Era natural ter tal distinção em Fortran, porque a linguagem era orientada linearmente (não é surpreendente para uma linguagem cuja entrada era feita por cartões perfurados). Você não podia ter declarações aninhadas. E enquanto você precisava de expressões matemáticas para trabalhar, não havia sentido em forçar mais nada a retornar um valor, pois poderia não haver algo esperando pelo retorno.
As limitações foram removidas com o surgimento de linguagens de estrutura de bloco, mas nesse ponto já era tarde demais. A diferença entre expressões e declarações já estava estabelecida. Ela se transferiu do Fortran para o Algol e, em seguida, para seus descendentes.
Quando uma linguagem é composta inteiramente de expressões, você pode compor expressões como desejar. Você pode escrever, seja (usando a sintaxe )
(se foo (= x 1) (= x 2))ou
(= x (se foo 1 2))7. Tipo símbolo (A symbol type). Os símbolos diferem de strings, e nesse caso você pode verificar a igualdade comparando os ponteiros.
8. Notação para código (A notation for code) usando árvores de símbolos.
9. Toda a linguagem sempre disponível (The whole language always available). Não há distinção explícita 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, ou ler ou compilar código durante a execução.
Executar código durante a leitura permite aos usuários reprogramar a sintaxe do Lisp; executar código durante a compilação é a base para macros; compilar durante a execução é a base para usar Lisps como uma linguagem de extensão em programas como Emacs; e finalmente, ler durante a execução permite que programas interajam usando s-expressões, uma ideia recentemente reinventada em XML.
Conclusão
Quando o Lisp foi apenas inventado, todas essas ideias estavam longe das práticas comuns de programação que eram ditadas pelo hardware disponível no final dos anos 1950.
Com o tempo, a linguagem padrão, incorporada no sucesso de linguagens populares, evoluiu gradualmente em direção ao Lisp. Os itens 1-5 agora são amplamente adotados. O item 6 começa a aparecer no mainstream. No Python, há uma forma do item 7, embora não haja sintaxe adequada para isso. O item 8, que (com o item 9) torna os macros no Lisp possível, ainda existe apenas no Lisp, possivelmente porque (a) requer esses parênteses ou algo igualmente ruim, e (b) se você adicionar esse último aumento de poder, não poderá mais afirmar que inventou uma nova linguagem, mas apenas desenvolveu um novo dialeto do Lisp; -)
Embora seja útil para programadores modernos, é estranho descrever Lisp em termos de suas diferenças em relação a truques aleatórios adotados em outras linguagens. Talvez isso não fosse o que McCarthy tinha em mente. Lisp não foi projetado para corrigir os erros do Fortran; ele surgiu mais como um subproduto de uma tentativa de .
Fonte: habr.com
