O Lisp ainda possui algum recurso especial que NÃO tenha sido adotado por outras linguagens de programação?

35

O Lisp ainda tem algum recurso especial que NÃO tenha sido adotado por outras linguagens de programação?

Por Lisp, quero dizer todas as linguagens de programação Lisp como um todo. Já me disseram como o Lisp é incrível e sei que muitas linguagens foram inspiradas por Lisp. Mas o Lisp ainda tem algum recurso de design exclusivo que simplesmente não pode ser feito em qualquer outro idioma?

A razão pela qual fiz a pergunta é que recentemente, sendo um programador amador, comecei a aprender Clojure apenas para divertido, e o resultado é que encontrei muitos posts e comentários relacionados a 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é mesmo a metaprogramação pode ser feita por muitos idiomas.

Eu perdi alguma coisa e o "Lisp ainda é diferente"?

Ou eu tenho sorte porque outras linguagens modernas roubaram todas as partes boas do Lisp, então não é necessário cavar o parênteses do mundo Lisp e "Lisp era diferente".

    
por iceX 03.09.2013 / 07:12
fonte

6 respostas

28

Uma referência canônica para esse tipo de pergunta é O que tornou o Lisp diferente 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 de sua escrita, são:

8. A notation for code using trees of symbols.

9. The whole language always available. There is no real distinction between read-time, compile-time, and runtime. You can compile or run code while reading, read or run code while compiling, and read or compile code at runtime.

O comentário aborda cada ponto e nomeia os idiomas populares em que esse recurso está disponível.

8, which (with 9) is what makes Lisp macros possible, is so far still unique to Lisp, perhaps because (a) it requires those parens, or something just as bad, and (b) if you add that final increment of power, you can no longer claim to have invented a new language, but only to have designed a new dialect of Lisp ; -)

Note que este artigo foi revisado pela última vez em 2002, e nos últimos 11 anos tem havido uma grande variedade de novos idiomas, alguns dos quais podem incorporar todos esses recursos de Lisp em seu design.

    
por 03.09.2013 / 07:22
fonte
15

A pergunta é difícil de responder, pois alguém teria que conhecer todas as linguagens para saber que nenhuma outra tem um recurso particular disponível no Lisp, então o seguinte é baseado nos idiomas com os quais tenho experiência.

No topo da minha cabeça, 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 de exceção, mas sem perturbar a pilha de chamadas entre o manipulador e a origem do exceção. Para ser justo, isso é apenas uma aplicação especial de continuações, então Ruby e Scheme (pelo menos) podem fazer isso.

O sistema macro Lisp se beneficia da regularidade / homoiconicidade, mas Scala está planejando incorporá-los como um recurso estável em 2.12 e Template Haskell alega características semelhantes. Eu diria que elas serão mais sintaticamente complexas do que com o Lisp, mas a geração de código em tempo de compilação está lá, independente disso.

Pense nisso, no entanto, a criação direta de formulários é apenas um tipo de macro disponível no Lisp: eu não vi um equivalente de macros de compilador ou leitor em nenhum outro lugar.

A capacidade de alguns dialetos (por exemplo, SBCL ) para salvar uma imagem de processo completa e recuperável é legal, mas novamente não é Único: Smalltalk faz isso há décadas.

Muitas outras linguagens permitem a atribuição de desestruturação ao retornar arrays, mas a abordagem # 'values e #' multiple-value-bind / let-values ainda parece ser específica do Common Lisp and Scheme (que ainda pode ser 'regular'). desestruturação também). O 'wantarray' do Perl permite que uma função determine se está sendo chamada em um escalar, lista ou contexto vazio para que possa ajustar seu valor de retorno de maneira semelhante (-ish), mas não vi valores de retorno múltiplos 'verdadeiros' fora de Scheme / CL.

Em termos de características de linguagem, provavelmente não há muito que o Lisp possa fazer para que outras linguagens não possam (a completude 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 ™ - que o código é dados - algo relativamente fácil de se trabalhar.

    
por 03.09.2013 / 15:29
fonte
4

Depois de tantas décadas, não acho que exista algo exclusivo para Lisp. Mas até hoje, há muitas coisas interessantes que são difíceis de encontrar fora de Lisps. Algumas coisas que vêm à mente:

  • Um sistema de objetos de alta qualidade com meta-protocolos sofisticados (ou seja, CLOS) não é remotamente popular.
  • vários métodos aparecem de tempos em tempos em algum lugar, mas a maioria das pessoas nunca ouviu falar deles.
  • Como outros salientaram, o sistema de condições é bastante sofisticado em comparação com os mecanismos populares de manipulação de exceções.
  • Uma representação compacta da semântica da linguagem (eval), uma abordagem capacitadora para definir a linguagem de alguém e torná-la disponível para adaptações profundas e diretas (consulte SICP ) - as funções "eval" das linguagens populares atuais simplesmente não compartilham as mesmas propriedades.

Finalmente, há muito mais a aprender do Lisp que não é sobre a linguagem 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 suas mãos em Genera, veja este comp.lang.lisp thread onde Kent Pitman descreve como" o Emacs é apenas uma sombra pálida dos Zmacs da Genera "- tudo isso foi habilitado por ter um poderoso sistema Lisp do qual o Zmacs fazia parte, que rodava em um Lisp Machine. .

    
por 03.09.2013 / 22:10
fonte
4

Não é necessariamente um único recurso . É a aparência e a sensação de como determinados conjuntos de recursos funcionam juntos.

JavaScript ou Java possuem muitos recursos do Lisp (máquina virtual, compilador / avaliador, coleta de lixo, etc.). Mas o JavaScript, por exemplo, não tem a parte de programação simbólica, não tem recursos matemáticos (internamente, tem apenas flutuadores), falta-lhe o tratamento de erros e assim por diante.

Muitos sistemas Common Lisp são otimizados para uma forma de desenvolvimento em que se estende um novo software incrementalmente, estendendo a linguagem Lisp em várias dimensões usando várias técnicas de meta-programação - sem reiniciar o software por um longo tempo. Assim, ele precisa ser flexível e extensível - mas, ao mesmo tempo, precisa ser robusto. Alterando o idioma (macros são basicamente uma maneira de o usuário estender o compilador) sem travar o programa.

Agora, algo como o 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 alguma hackear OOP .

Exemplo:

Pode-se implementar um software geral de matemática avançada para o domínio da álgebra computacional, na maioria das vezes de duas maneiras: escreva o mecanismo em C com uma linguagem especializada no topo (como Mathematica ) ou em algum dialeto Lisp mais avançado. Macsyma / Maxima no Common Lisp, Reduzir no Standard Lisp, Axiom no Common Lisp.

(Há também um ou mais escritos em Python.)

Não há muitos sistemas que oferecem o conjunto de recursos de algo como Axiom , que é executado em cima do Common Lisp.

O que tornou o Lisp atrativo para esses tipos de aplicativos é uma mistura de recursos: matemática básica avançada (bignums, rácios, ...), computação simbólica, compilador interativo, etc. É bem possível obter essas coisas implementando-as em uma linguagem de baixo nível. Dessa forma, um terá implementado 50% ou mais de um sistema Lisp típico.

    
por 04.09.2013 / 00:25
fonte
2

Não tanto quanto eu sei. Forth é facilmente tão dinâmico quanto Lisp, talvez mais ainda, já que o código dinâmico em Forth se parece com o código Forth regular, enquanto as macros Lisp tendem a usar recursos diferentes do código Lisp normal (em Clojure pelo menos eu nunca usei citação de sintaxe fora de uma macro) e como resultado eles parecem muito diferentes do código Lisp normal. Como um exemplo de como a dinâmica é Forth, aqui está uma maneira de implementar comentários no futuro. :

: (   41 word drop ; immediate
( That was the definition for the comment word. )
( Now we can add comments to what we are doing! )
    
por 03.09.2013 / 17:21
fonte
2

Lisp tem muitos dialetos e cada um deles tem seu próprio conjunto de recursos. Meu recurso favorito que é improvável de ser adotado por qualquer outro idioma é a "pilha de espaguete" de Interlisp .

A pilha de espaguete é como um encerramento, mas em 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ê poderia criá-las arbitrariamente, resultando em uma hierarquia de contextos de pilha.

    
por 03.09.2013 / 08:08
fonte