Quais são as diferenças entre Clojure, Scheme / Racket e Common Lisp?

120

Eu sei que eles são dialetos da mesma família de línguas chamada lisp, mas quais são exatamente as diferenças? Você poderia dar uma visão geral, se possível, cobrindo tópicos como sintaxe, características, recursos e recursos.

MaiaVictor
fonte
3
Estou pedindo uma visão geral das diferenças porque acho que essa pergunta pode ser útil para muitas outras pessoas, desculpe se parece abusivo.
MaiaVictor
4
Eu sempre fico confuso sobre qual postagem deveria ir para onde. Esta é uma discussão sobre ferramentas, então é uma questão para aqui ou para os programadores? Logicamente, eu diria que mova para os programadores, porque não está pedindo para resolver um problema em particular, mas é um bom post com uma boa resposta IMHO.
octopusgrabbus de
1
@octopusgrabbus: a questão é muito ampla. Comparar três linguagens de programação em 'sintaxe, características, recursos e recursos' pode facilmente encher um livro ou um site da web. Stackoverflow é para pessoas que têm problemas de programação, não é uma enciclopédia (Wikipedia), não é um fórum de discussão geral (Usenet), não é um site de comparação de linguagem ( rosettacode.org ). É melhor para problemas reais de programação em que a pergunta tem código e as respostas também têm código. Mais: não invente problemas só porque alguém está entediado ou isso é um hobby.
Rainer Joswig
3
Só porque a questão é ampla, não significa que não pertença aqui. É uma pergunta perfeitamente clara e certamente uma "verdadeira questão de programação". StackOverflow tem como objetivo principal ser um recurso da comunidade [googleable] para compartilhar conhecimento sobre programação via formato de perguntas e respostas.
Dan Burton
@RainerJoswig, eu poderia escrever tudo o que aprendi sobre essas línguas nos últimos dias que as estudei, mas isso tornaria a discussão grande. Isso é muito ruim quando você percebe que as pessoas estarão pesquisando esse tipo de frase curta no Google e não serão capazes de obter a resposta porque um texto grande as impede de entender rapidamente o que está sendo perguntado. Isso garante que muito mais pessoas serão ajudadas por uma boa resposta.
MaiaVictor

Respostas:

103

Todos eles têm muito em comum:

  • Linguagens dinâmicas
  • Fortemente tipado
  • Compilado
  • Sintaxe do estilo Lisp, ou seja, o código é escrito como estruturas de dados Lisp (formulários) com o padrão mais comum sendo chamadas de função como: (function-name arg1 arg2)
  • Sistemas de macro poderosos que permitem tratar o código como dados e gerar código arbitrário em tempo de execução (frequentemente usado para "estender a linguagem" com uma nova sintaxe ou criar DSLs)
  • Freqüentemente usado no estilo de programação funcional, embora tenha a capacidade de acomodar outros paradigmas
  • Ênfase no desenvolvimento interativo com um REPL (ou seja, você desenvolve interativamente em uma instância em execução do código)

Características distintivas comuns do Lisp:

Características distintivas do Clojure:

  • O maior ecossistema de biblioteca, já que você pode usar diretamente qualquer biblioteca Java
  • Vetores []e mapas {}usados ​​como padrão, além das listas padrão ()- além da utilidade geral de vetores e mapas, alguns acreditam que esta é uma inovação que torna geralmente mais legível
  • Maior ênfase na imutabilidade e programação funcional preguiçosa, inspirada em Haskell
  • Fortes recursos de simultaneidade com suporte de memória transacional de software no nível do idioma (vale a pena assistir: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Características distintivas do esquema:

  • Provavelmente o mais simples e fácil de aprender Lisp
  • Macros higiênicas (consulte http://en.wikipedia.org/wiki/Hygienic_macro ) - evita elegantemente os problemas de captura acidental de símbolo em expansões de macro
Mikera
fonte
11
isso é bom, mas talvez você deva mencionar que a raquete é mais do que "apenas" um esquema; é um sistema que suporta vários (mas relacionados) idiomas (você pode até definir o seu próprio). além disso, clojure tem várias maneiras de fazer programação semelhante a oo (uma abordagem de envio múltiplo vagamente semelhante a clos e algo mais próximo de java que é mais eficiente no jvm). e o esquema está avançando em direção a mais bibliotecas padrão (que também incluem oo) com r6rs, que o racket suporta.
Andrew Cooke
2
"Linguagem dinâmica fortemente tipada" é marketing. Nesse sentido, até Python é fortemente tipado.
ron
16
@ron: Python é fortemente tipado, assim como Lisp (ao contrário de, digamos, Javascript ou VB). Em vez disso, você está pensando em "tipagem estática" versus "tipagem dinâmica", consulte en.wikipedia.org/wiki/Type_system para todas as variedades. Mas sim, é marketing
Nas Banov
2
Eu também acho que Racket seria bom ser adicionado a esta resposta. Eu acho que Racket é ainda mais fácil de aprender do que Scheme devido à comunidade e ao foco do idioma. Racket (anteriormente denominado PLT Scheme) é uma linguagem de programação multiparadigma de propósito geral da família Lisp / Scheme. Um de seus objetivos de design é servir como uma plataforma para a criação, design e implementação de linguagem.
mtelesha
Clojure tem macros higiênicas. Mais informações aqui: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff
50

As pessoas acima perderam algumas coisas

  1. O Lisp comum também tem vetores e tabelas de hash. A diferença é que Common Lisp usa # () para vetores e nenhuma sintaxe para tabelas hash. Esquema tem vetores, eu acredito

  2. Common Lisp tem macros de leitura, que permitem que você use novos colchetes (como faz Racket, um descendente de Scheme).

  3. Scheme e Clojure têm macros higiênicas, ao contrário das não higiênicas do Common Lisp

  4. Todos os idiomas são modernos ou têm extensos projetos de renovação. Common Lisp obteve extensas bibliotecas nos últimos cinco anos (graças principalmente ao Quicklisp), Scheme tem algumas implementações modernas (Racket, Chicken, Chez Scheme, etc.) e Clojure foi criado há relativamente pouco tempo

  5. Common Lisp tem um sistema OO embutido, embora seja bastante diferente de outros sistemas OO que você possa ter usado. Notavelmente, não é obrigatório - você não precisa escrever código OO.

  6. As linguagens têm filosofias de design um pouco diferentes. Scheme foi projetado como um dialeto mínimo para a compreensão do Modelo do Ator; mais tarde foi usado para pedagogia. O Lisp comum foi projetado para unificar a miríade de dialetos Lisp que surgiram. Clojure foi projetado para simultaneidade. Como resultado, Scheme tem uma reputação de ser minimalista e elegante, Common Lisp de ser poderoso e agnóstico de paradigma (funcional, OO, qualquer que seja) e Clojure de favorecer a programação funcional.

Cosman246
fonte
4
Racket não é uma implementação do Scheme, barrando os modos de compatibilidade. Consulte stackoverflow.com/questions/3345397
bug
Clojure não tem macros higiênicas, pois descobri da maneira mais difícil.
pyon
40

Não se esqueça das diferenças Lisp-1 e Lisp-2.

Scheme e Clojure são Lisp-1:
Isso significa que os nomes de variáveis ​​e funções residem no mesmo namespace.

Lisp comum é Lisp-2:
funções e variáveis ​​têm namespaces diferentes (na verdade, CL tem muitos namespaces).

Paulo
fonte
-4

Gimp é escrito em Scheme :)

Na verdade, parte do software que algumas pessoas pensam que pode ser escrito em C ++ foi provavelmente feito sob o guarda-chuva do Lisp, é difícil escolher as maçãs douradas do grupo. O fato é que o C ++ nem sempre foi popular, ele só parece ser popular hoje por causa de um histórico de atualizações. Na metade inferior do século, o C ++ nem mesmo utilizava multithreading, era onde o Python é hoje uma fossa de código-cola com erros não testado e inútil. Avance um pouco mais rápido e agora estamos vendo um aumento na programação funcional, é mais como se adaptar ou morrer. Acho que Java está certo no que diz respeito à parte de adaptação.

Scheme foi projetado para simplificar a linguagem Lisp, essa era sua única intenção, exceto que nunca realmente pegou. Eu acho que Clojure faz algo semelhante, seu objetivo é simplificar o Scheme para a JVM e nada mais. É como qualquer outra linguagem JVM, ali apenas para aumentar a experiência do usuário, apenas para simplificar a escrita de boilerplate na terra do Java.

Meeple
fonte
2
"destinado a simplificar o Scheme para a JVM nada mais" "assim como qualquer outra linguagem JVM" Sim, certo.
oskarkv
4
Gimp é escrito em C e suporta Scheme, Python e Perl como linguagens de script.
lbalazscs