[quote=Thiagosc]
Seja humilde, reconheça que não conhece algo e procure se informar melhor.
Para complementar. Por “representação” eu quero dizer a AST. Em uma linguagem derivada de Algol existe uma gramática arbitrária definida pelo projetista da lingua. Com base nessa gramática um parser é gerado, que transforma as produções em uma AST (Abstract Syntax Tree). A partir dessa AST é que a compilação é feita, podendo ela ser para outra linguagem, código nativo, vm, etc.
Assim é Java, C++, C#, etc.
Lisp é uma AST. Você trabalha diretamente com a árvore. Existem diversas vantagens, como por exemplo a gramática ser super simples e permitir coisas como macros.
No caso do C o preprocessador não está trabalhando com a representação em árvore do código, mas sim com strings. Ele simplesmente substitui texto a partir de regras muito simples. Em Lisp você recebe uma árvore por parâmetro, retorna uma árvore como resultado e esse novo ramo substitui a chamada da macro na árvore de representação.
Funciona mais ou menos assim a grosso modo:
C
- preprocessador atualiza texto;
- parser transforma o resultado em uma AST;
- compilador compila para alguma plataforma.
Lisp
- o reader transforma o código em uma árvore;
- as macros são expandidas, e seus respectivos locais de chamada na árvore são substituídos por sub-árvores;
- é interpretado ou compilado para alguma plataforma;
Isso permite por exemplo:
código original: código transformado
- rotina1 - rotina1
-- instrução 1 -- instrução 1
-- instrução 2 -- instrução 2
-- macro (setf (car x) y) -- rplaca x y
-- instrução 3 -- instrução 3
-- instrução 4 -- instrução 4
- rotina1 - rotina1
-- instrução 1 -- instrução 1
-- instrução 2 -- instrução 2
-- macro (setf (symbol-value z) y) -- setq x y
-- instrução 3 -- instrução 3
-- instrução 4 -- instrução 4
E dentro da macro setf ele inspeciona os parâmetros passados e se for car ele retorna uma instrução (poderia ser uma seqüência de instruções) e se for outra coisa ele retorna outra coisa.
Dá para criar classes, objetos, funções, etc, desse jeito. Portanto dá para otimizar o código em formas que são impossíveis em linguagens como C++.[/quote]
Numa boa thiago, eu nunca disse que dialetos lisp não funcionavam dessa maneira, aliás disse o contrário, que elas são como preprocessadores. Da mesma maneira não fico pregando sobre linguagens. O que eu disse, é que o preprocessador me permite mudar as sintaxes da linguagem c++, da mesma maneira que lisp permite. O link que te passei sobre preprocessadores mostra isso.
Sobre c++, essas empresas citadas a usam até hoje devido a alta otimização de código, que seu compilador pode gerar no assembler final(executável pequeno, mínimo overhead, etc…), baixo nível(assembler inline) e flexibilidade da mesma. O melhor exemplo é o compilador INTEL, que é imbatível. A própria MS usa o INTEL em seus SOs. Lisps não são úteis para isso.
Para falar que uma linguagem ou compilador, são ruins, no mínimo você precisaria ser doutor na área de compiladores.
cada pessoa se adapta na linguagem que se sente mais confortável.