Qual dialeto do Lisp devo aprender? [fechadas]

89

Eu sei que existem alguns dialetos diferentes do Lisp. Tendo decidido que aprender Lisp seria uma nova experiência intelectual, gostaria de saber qual dialeto Lisp aprender e por quê.

Existe algum que seja mais popular do que os outros? Algum deles é mais "completo", melhor documentado e suportado? Quais são os prós e os contras desse dialeto?

Humphrey Bogart
fonte
Eu fiz uma pesquisa sobre isso antes de perguntar isso, mas a natureza da pergunta evoluiu conforme eu a digitava. Vou garantir que não vou reinventar a roda.
Humphrey Bogart
Então, qual é a diferença entre esta pergunta e a que Greg menciona acima?
cjs de
2
Acho que o que ele estava tentando dizer era: Quando formulei minha pergunta pela primeira vez, ela era completamente diferente da atual e olhar para as perguntas na pesquisa relacionada não revelou nenhuma que se encaixasse com o que ele queria pergunte. Mas no momento em que ele digitou a pergunta, ela havia mudado e, portanto, chegou ao SO em sua forma atual, que foi feita anteriormente.
J. Polfer de

Respostas:

76

Você deseja buscar um equilíbrio entre simplicidade e limpeza, recursos atraentes e uma plataforma que permitirá a você escrever software interessante e útil (para você mesmo), bem como servir como uma ferramenta de aprendizado. (Este último o ajudará a aprender por muito mais tempo.) Aqui estão algumas possibilidades:

  1. Esquema. Provavelmente o mais limpo de todos os dialetos. É sem dúvida por isso que The Little Schemer foi traduzido do LISP para o Scheme. A quinta especificação padrão do Scheme, R5RS , é uma educação maravilhosa por si só; pode ser a melhor linguagem e especificação de biblioteca que já li, bem como a mais curta e razoavelmente abrangente. A plataforma PLT Scheme (agora Racket) inclui um interpretador e compilador razoavelmente decente, é boa para scripts e também tem algumas ferramentas visuais que a tornam excelente para o aprendizado.

  2. Lisp comum. Provavelmente a variante mais portátil e abrangente, é mais provável que você queira se quiser escrever coisas como software comercial. O padrão define bibliotecas extensas, e muitos mais estão disponíveis além disso, ele tem CLOS , que provavelmente ensinará mais sobre OO do que qualquer linguagem OO poderia, e alguns dos compiladores são muito bons. As desvantagens incluem algumas falhas que o Scheme não possui (como ter um namespace separado para variáveis ​​que se referem a funções), não ser tão limpo e simples (como é o caso de qualquer coisa que teve que ter as extensões e fazer os compromissos necessários para grandes aplicações no mundo real), não tendo macros higiênicas e enfatizando a recursão muito menos do que o Scheme.

  3. Clojure.Isso é executado na JVM, o que pode ser uma vantagem para os desenvolvedores Java. Ele tem algumas falhas (por exemplo, você deve solicitar explicitamente a otimização da chamada final, embora isso possa mudar um dia se o TCO for adicionado à JVM). As macros, embora não sejam higiênicas, têm alguns recursos para ajudá-lo a evitar a captura de variáveis, de modo que você pode capturar variáveis ​​se realmente quiser, enquanto corre menos risco de fazer isso acidentalmente do que no CL. Você tem acesso fácil a todas as bibliotecas Java; isso provavelmente é uma coisa boa para o código do "mundo real" e bastante inútil em termos de aprendizado. Possui um conjunto de bibliotecas para estruturas de dados persistentes e suporte para STM, o que o torna muito interessante do ponto de vista concorrente; isso a torna provavelmente a sua melhor aposta se você ' Estou interessado em aprender mais sobre novos métodos de lidar com programação simultânea e paralela. Parece que o Clojure é tão utilizável para grandes aplicativos de produção quanto Java, no sentido de que terá a capacidade de fazer as "coisas feias" que você faz em aplicativos de produção que você prefere não fazer e não fazer quando você está aprendendo.

  4. Emacs Lisp. Em termos de LISP, este não é um dos melhores exemplos que existe. Uma de suas maiores falhas é o escopo dinâmico, mas existem muitas outras. No entanto, se você é um usuário Emacs, esta pode ser a ferramenta mais poderosa que você pode aprender para melhorar o uso do editor. Quanto você realmente aprenderia ao aprender Emacs Lisp, além de como estender o Emacs, é para mim uma questão em aberto; Não sei com que frequência técnicas interessantes, como funções de alta ordem, são realmente usadas no Emacs Lisp.

Atualização de 2018

Já se passou quase uma década desde que escrevi este post e a família de linguagens Lisp agora parece estar ganhando força significativa na consciência geral do programador. Muito disso parece estar relacionado ao Clojure, que não apenas se tornou um dialeto separado do Lisp por si só, introduzindo muitas de suas próprias boas ideias, mas também agora tem uma versão quase idêntica voltada para o JavaScript e inspirou muitos outros Lisps visando outras plataformas. Por exemplo, Hy tem como alvo o CPython AST e bytecode, visando primeiro a interoperabilidade com Python, mas usando ideias Clojure "em caso de dúvida". (Embora a partir dos últimos commits, o último pode estar mudando um pouco.)

A grande mudança que isso traz em seu processo de tomada de decisão é que você também deve olhar para qualquer Lisps ou linguagens semelhantes a Lisp disponíveis e interoperar com linguagens ou plataformas que você já usa, seja Perl , Ruby , Erlang , Go ou mesmo C ++ em microcontroladores .

cjs
fonte
3
Ter namespaces separados não é uma vergonha, é apenas uma decisão de design diferente. Tenha em mente que já existem vários outros namespaces também no Scheme, então o debate é bastante Lisp-5 contra Lisp-6. Além da comodidade de poder chamar uma lista de "lista" e um carro de "carro" em CL, seu sistema de macro é muito mais prático e útil, pois o compilador não confunde as coisas tão facilmente.
Svante
Clojure não tem otimização de chamada de cauda, ​​e não pode, porque o bytecode JVM não oferece suporte. Tudo o que ele tem é uma forma especial "recorrente" que auto-repete a função atual.
Svante
3
Curt: Eu diria que o Clojure é o mais portátil, pois roda no Java VM.
justinhj
1
Eu não sei sobre isso; se você excluir dispositivos pequenos e incorporados (como telefones e cartões inteligentes) onde não vai executar um programa de desktop / servidor não modificado de qualquer maneira, o elisp certamente roda em muito mais CPUs e plataformas do que a JVM.
cjs
1
Eu discordo fortemente. A recursão tende a produzir código que é a) mais puro, b) mais fácil de verificar, c) mais provável de estar correto. Em mais detalhes: a) tende menos a tocar menos variáveis ​​fora da função; b) uma prova indutiva tende a cair naturalmente da função recursiva, enquanto com loops você precisa verificar invariantes de loop, etc .; c) a confiabilidade vem de a) e que você tende a ser forçado a codificar de uma forma que naturalmente o faz fazer (talvez informalmente) a prova indutiva de b).
cjs
22

Eu diria Scheme, apenas por causa do Little Schemer , que é um dos livros mais divertidos e extremamente difíceis que já tentei ler.

J. Polfer
fonte
15
Não se esqueça do SICP! mitpress.mit.edu/sicp . Esta é uma leitura clássica.
Joris Timmermans
7
Houve duas ou três edições de The Little Lisper antes de The Little Schemer sair como uma tradução dessas.
cjs
9

Posso recomendar Common Lisp no SBCL . Essa combinação é rápida, poderosa, madura e bem documentada.

Leslie P. Polzer
fonte
8

Além disso, Clojure está ganhando muita atenção nos dias de hoje, e por um bom motivo. Ótimas estruturas de dados, suporte de simultaneidade profundamente bom (deixa Scheme e CL envergonhados a este respeito) e uma grande comunidade. Também é relativamente simples, CL é tão complicado quanto C ++.

Isso não quer dizer que eu não goste de CL ou Scheme. Aprendi Scheme com SICP. E CL me trouxe para Clojure. Tudo depende de seus objetivos, suponho. Se você quer aprender um Lisp imensamente prático, escolha Clojure. Caso contrário, CL ou Scheme são ótimos.

dnolen
fonte
Isso parece implicar que nem CL nem Scheme são "imensamente práticos", embora sejam bastante práticos de fato. Especialmente o padrão CL nasceu de considerações práticas.
Leslie P. Polzer
2
O panorama da linguagem de programação mudou desde 1994, não sei como o padrão CL vai mudar / evoluir para acomodar o que foi aprendido desde então. O mundo está balançando para frente e, pelo que posso dizer, CL está parado. Eu gosto de CL, Clojure tem um caminho a percorrer para se aproximar de seu poder, mas não vejo como CL vai evoluir - se você for usar uma linguagem padronizada, um caminho evolutivo deve ser aparente. Sem ele, um idioma muito provavelmente não é uma escolha prática.
dnolen
4
CL evoluiu e está evoluindo por meio de muitas bibliotecas muito úteis. A linguagem base já era mais poderosa em 1994 do que todas as linguagens "modernas" de hoje.
Svante
5

Eu prefiro CL, pois gosto de programação orientada a objetos, e CLOS é o sistema de objetos mais legal do mercado.

Jrockway
fonte
5
Por falar em CL, eu recomendaria ClozureCL ou SBCL. Ambos são de código aberto, bem documentados, maduros, multiplataforma e fornecem funcionalidade não padrão crucial, como multithreading.
Daniel Dickison
5

Aprendi Scheme na escola. Foi um ótimo aprendizado e nunca esquecerei os fundamentos da programação funcional. Provavelmente não importa qual versão do LISP você escolha, contanto que você entenda o núcleo de sua utilidade - cálculo lambda sem estado.

Aqui está um artigo interessante sobre Por que o MIT mudou de Scheme para Python em seu curso introdutório de programação.

Jinsungy
fonte
3

Eu diria todos eles, pelo menos no início. Eventualmente, você provavelmente desenvolverá uma preferência por Scheme ou Common Lisp, mas ambos têm diferenças suficientes para que seja melhor controlar tudo o que está por aí.

Scheme tem continuações, por exemplo, e é bom aprender sobre elas em Scheme, embora possam ser implementadas em Common Lisp.

Aprender a diferença entre escopo lexical e dinâmico é importante, e se você aprender tanto Common Lisp quanto elisp, encontrará as implicações de ambos.

Justinhj
fonte
0

LFE (Lisp Flavored Erlang) seria bom. Você pode ter a sintaxe lisp no topo do Erlang VM.


fonte
0

Era um tipo de pergunta "carregada" para começar, mas OP provavelmente não sabia sobre isso. Geralmente, lispers Common e Scheme são como "pessoas" de computadores PC e Apple, eles não se misturam. Qual é o melhor provavelmente não é tão relevante quanto qual "funciona" para você. Realmente, não há muita diferença. Provavelmente a preferência por um em relação ao outro pode ser influenciada por qual deles você aprende primeiro. (Para mim, uma lista vazia deveria ser "nada", conhecido em CL como NIL, e isso me torna um Common Lisper.) Gosto da integração do SBCL com o Slime usando EMACS, mas o SBCL não é para todos. Por um lado, o SBCL é muito rígido. Se você apenas deseja "se divertir", o clisp do GNU é fácil e está disponível para praticamente todas as plataformas.

Wiley
fonte