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?
Respostas:
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:
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.
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.
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.
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 .
fonte
Eu diria Scheme, apenas por causa do Little Schemer , que é um dos livros mais divertidos e extremamente difíceis que já tentei ler.
fonte
Posso recomendar Common Lisp no SBCL . Essa combinação é rápida, poderosa, madura e bem documentada.
fonte
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.
fonte
Eu prefiro CL, pois gosto de programação orientada a objetos, e CLOS é o sistema de objetos mais legal do mercado.
fonte
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.
fonte
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.
fonte
LFE (Lisp Flavored Erlang) seria bom. Você pode ter a sintaxe lisp no topo do Erlang VM.
fonte
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.
fonte