O Lisp ainda possui algum recurso especial que NÃO foi adotado por outras linguagens de programação?
Por Lisp, quero dizer todas as linguagens de programação Lisp como um todo. Disseram-me como o Lisp é incrível e sei que muitas línguas foram inspiradas pelo Lisp. Mas o Lisp ainda possui algum recurso de design exclusivo que simplesmente não pode ser feito em nenhum outro idioma?
A razão pela qual eu fiz a pergunta é que recentemente, como programador amador, comecei a aprender Clojure apenas por diversão, e o resultado é que encontrei muitas postagens e comentários relacionados ao Lisp, dizendo apenas uma coisa: "Lisp é único ", mas outras linguagens de programação modernas já adotaram e roubaram muitas idéias do Lisp, como condicionais, recursão e a função de cidadão de primeira classe. E até a metaprogramação pode ser feita em vários idiomas.
Perdi alguma coisa e "Lisp ainda é diferente"?
Ou tenho sorte porque outras línguas modernas roubaram todas as partes boas do Lisp, de modo que não é necessário cavar o mundo do Lisp entre parênteses e "Lisp era diferente".
Respostas:
Uma referência canônica para esse tipo de pergunta é o What Made Lisp Different, de Paul Graham . Os dois principais recursos restantes do Lisp que não estão amplamente disponíveis, de acordo com este artigo no momento da redação deste documento, são:
O comentário aborda cada ponto e nomeia os idiomas populares onde esse recurso está disponível.
Observe que este artigo foi revisado pela última vez em 2002 e, nos últimos 11 anos, houve uma grande variedade de novos idiomas, alguns dos quais podem incorporar todos esses recursos do Lisp em seu design.
fonte
eval
ou similar, e algumas podem fazer metaprogramação, por exemplo, Haskell, modelo de Haskell. O (indiscutivelmente) único do Lisp é que a representação para dados, código e meta-código é a mesma - não apenas na sintaxe, mas na verdade é a mesma coisa.A pergunta é difícil de responder, pois alguém precisaria conhecer todos os idiomas para saber que nenhum outro possui um recurso específico disponível no Lisp. Portanto, o seguinte é baseado nos idiomas com os quais tenho experiência.
De cabeça para baixo, condições são algo que eu não vi em nenhum outro idioma. Pense em 'exceções', mas onde a pilha de chamadas não é desenrolada e onde o chamador pode enviar um valor de recuperação para o site da exceção, mas sem perturbar a pilha de chamadas entre o manipulador e a origem da exceção. Para ser justo, isso é realmente apenas uma aplicação especial de continuações, para que Ruby e Scheme (pelo menos) possam fazer isso.
O sistema macro de Lisp se beneficia da regularidade / homoiconicidade, mas Scala planeja incorporá-los como um recurso estável na 2.12 e o Template Haskell reivindica recursos semelhantes. Eu diria que eles serão mais sintaticamente complexos do que com o Lisp, mas a geração de código em tempo de compilação está lá independentemente.
No entanto, pensando bem, a construção direta de formulários é apenas um tipo de macro disponível no Lisp: nunca vi um equivalente de macros de compilador ou leitor em nenhum outro lugar.
A capacidade de alguns dialetos (por exemplo, SBCL ) de salvar uma imagem de processo completa e recuperável é legal, mas, novamente, não é única: o Smalltalk faz isso há décadas.
Muitas outras linguagens permitem a atribuição de desestruturação ao retornar matrizes, mas a abordagem # 'values e #' multiple-value-bind / let-values ainda parece ser específica para Common Lisp and Scheme (que ainda pode fazer a desestruturação 'regular' também ) O 'wantarray' de Perl permite que uma função determine se está sendo chamada em um contexto escalar, de lista ou vazio, para que possa ajustar seu valor de retorno de uma maneira (-ish) semelhante, mas eu não vi vários valores de retorno 'verdadeiros' fora do esquema / CL.
Em termos de recursos de idioma, provavelmente não há muito o que o Lisp possa fazer que outros idiomas não possam (a integridade de Turing é o que é). O que é , no entanto, é uma linguagem em que o código é expresso em termos de suas próprias estruturas de dados, tornando a Big Idea ™ - esse código são dados - algo relativamente fácil de trabalhar.
fonte
Depois de tantas décadas, acho que não há nada exclusivo no Lisp. Mas ainda hoje existem muitas coisas interessantes que são difíceis de encontrar fora de Lisps. Algumas coisas que vêm à mente:
Finalmente, há muito mais a aprender com o Lisp que não é sobre o idioma em si, mas se tornou parte da história do Lisp e se perdeu no tempo. Por exemplo, Interlisp, Symbolics Genera, etc ... se você nunca colocar as mãos em Genera, consulte este tópico comp.lang.lisp em que Kent Pitman descreve como "o Emacs é apenas uma sombra pálida do Zmacs do Genera" - que foi habilitado por ter um poderoso sistema Lisp do qual o Zmacs fazia parte, que rodava em uma máquina Lisp.
fonte
Não é necessariamente uma característica única . É toda a aparência e o modo como certos conjuntos de recursos funcionam juntos.
JavaScript ou Java têm muitos recursos do Lisp (máquina virtual, compilador / avaliador, coleta de lixo, etc.). Mas o JavaScript, por exemplo, carece da parte simbólica da programação, carece de recursos matemáticos (internamente, possui apenas flutuadores), carece de tratamento de erros e assim por diante.
Muitos sistemas Common Lisp são otimizados para uma maneira de desenvolvimento, na qual se estende um novo software de forma incremental, estendendo a linguagem Lisp em várias dimensões usando várias técnicas de metaprogramação - sem reiniciar o software por um longo tempo. Portanto, ele precisa ser flexível e extensível - mas, ao mesmo tempo, precisa ser robusto. Alterar o idioma (macros são basicamente uma maneira de o usuário estender o compilador) sem travar o programa.
Agora, algo como JavaScript também é usado para estender um programa, normalmente um navegador da web. Mas, na maioria das vezes, não há muita meta-programação em JavaScript - além de alguns hackers OOP .
Exemplo:
Pode-se implementar um software geral de matemática avançada para o domínio da álgebra computacional de duas maneiras: escrever o mecanismo em C com uma linguagem especializada no topo (como o Mathematica ) ou em algum dialeto Lisp mais avançado. Macsyma / Maxima em Lisp comum, Reduzir em Lisp padrão, Axioma em Lisp comum.
(Também há um ou mais escritos em Python.)
Não existem muitos sistemas que ofereçam o conjunto de recursos do Axiom , que roda sobre o Common Lisp.
O que tornou o Lisp atraente para esses tipos de aplicativos é uma mistura de recursos: matemática básica avançada (bignums, proporções, ...), computação simbólica, compilador interativo etc. É bem possível obter essas coisas implementando-as em um linguagem de nível. Dessa forma, um terá implementado 50% ou mais de um sistema Lisp típico.
fonte
Não tanto quanto eu sei. O Forth é facilmente tão dinâmico quanto o Lisp, talvez mais porque o código dinâmico do Forth se parece com o código Forth regular, enquanto as macros do Lisp tendem a usar recursos diferentes do código Lisp normal (no Clojure, pelo menos, nunca usei aspas de sintaxe fora de uma macro) e Como resultado, eles parecem realmente diferentes do código Lisp comum. Como um exemplo de quão dinâmico é o Forth, aqui está uma maneira de implementar comentários no Forth :
fonte
O Lisp possui muitos dialetos e cada um deles possui seu próprio conjunto de recursos. Meu recurso favorito que dificilmente será adotado por qualquer outro idioma é o "spaghetti stack" do Interlisp .
A pilha de espaguete é como um fechamento, mas com esteróides. Ele salva não apenas a função atual, mas todo o contexto até o topo da pilha. Algo como uma co-rotina , exceto que você pode criá-las arbitrariamente, resultando em uma hierarquia de contextos de pilha.
fonte