Tento me ensinar uma nova linguagem de programação em intervalos regulares de tempo. Recentemente, li como o Lisp e seus dialetos estão no extremo oposto do espectro de linguagens como C / C ++, o que me deixou curioso o suficiente para saber mais sobre isso. No entanto, duas coisas não estão claras para mim, e estou procurando orientação sobre elas:
O LISP ainda é praticado / usado no mundo de hoje ou é uma linguagem herdada como FORTRAN / COBOL? Quero dizer, além de manter o código existente, ele é usado em novos projetos?
Qual é o dialeto mais usado? Me deparei com Scheme e Common Lisp como os dois dialetos mais comuns e queria sua opinião sobre qual é o mais favorecido / útil para aprender - e ficaria imensamente satisfeito se você pudesse sugerir recursos para um iniciante no ranking.
Embora esteja ansioso para aprender uma linguagem que seja fundamentalmente diferente das linguagens processuais às quais estou acostumado, não quero investir esforços indevidos em algo que seja totalmente obsoleto - eu ainda o aprenderia se estivesse profissionalmente "morto", mas apenas com uma perspectiva acadêmica ...
Respostas:
Eu gosto bastante de Scheme, se você deseja trabalhar com a JVM, deve verificar o Clojure, que é um cisco projetado para funcionar na JVM. E sim, Lisp ainda vale a pena aprender a ver o quão poderoso um design tão minimalista pode ser! As pessoas que criaram o lisp acertaram algumas coisas. É incrível quantos dos novos recursos interessantes das linguagens modernas o lisp tinha nos anos 60!
Para um esquema incorporado, tente o guile: http://www.gnu.org/s/guile/
fonte
Em resposta à pergunta 2, "Dialeto mais utilizado":
Depende de como você interpreta "Mais utilizado". Aqui estão algumas matemáticas de guardanapos para limites inferiores de quanto cada um dos dialetos escolhidos usa.
Código mais bruto escrito
Vencedor: Scheme ou Common Lisp. Muitas incógnitas.
A maioria dos códigos de 'produção'
Vencedor: Acho que o Common Lisp . Acho que podemos responder "Sim" à pergunta 1 com base no uso do Common Lisp e Clojure.
A maioria dos usuários finais
Vencedor: O esquema tem o melhor limite inferior aqui, já que existem números de vendas no Uncharted, mas é bastante discutível.
Conclusão
Em conclusão, acho que maçãs grandes.
fonte
Sim, é, mas você precisa saber para onde procurar. As pessoas que usam o LISP não costumam gritar muito alto, mas há alguns exemplos de algumas startups de alto nível que o usaram com grande efeito nos últimos 20 anos. Também é muito popular entre pequenas empresas na Europa.
Esta é uma pergunta válida, mas não é fácil de responder. Também pode não ser particularmente útil responder: muitas implementações têm um foco específico; portanto, são melhor escolhidas se ajustarem ao seu problema específico, em vez de se basearem em quão amplamente ele é usado. Em vez disso, vou falar um pouco sobre suas opções e você pode decidir por si mesmo.
O LISP é uma família de idiomas e cada um desses idiomas possui uma família de dialetos e implementações. Em geral, os dialetos se enquadram em dois campos "LISPs" e "Schemes".
LISPs: Até relativamente recentemente, o Common LISP era o rei. Foi uma tentativa de unificar todos os LISPs díspares e, sem ser cruel, foi o "C ++" do LISP. Ou seja, era uma linguagem enorme . Tinha tudo. Nos últimos anos, Clojure apareceu. Clojure é um LISP que roda na Java Virtual Machine e tenta se enraizar em uma filosofia de programação funcional. Tradicionalmente, outros LISPs têm sido estritamente multiparadigmas. O Clojure é interessante porque obtém o melhor e o pior do LISP e da JVM. Ainda há um monte da verbosidade de linguagens baseadas em Java e eles têm sido bastante fácil e gratuito com a sintaxe de modo que tem muitos botões e teclas para coisas diferentes, mas eles têm alguns realmenteidéias interessantes sobre tipos de dados, especialmente algumas das formas práticas que eles têm para aplicar idéias da programação funcional.
Esquemas: Esquemas são um subconjunto estrito de LISPs. O esquema foi inventado por Steele e Sussman e, no início da vida, era notável por ser usado no curso de palestras do MIT Computing 101. O esquema é definido no "Relatório Revisado ^ n sobre o Esquema de Linguagem Algorítmica (RnRS)". Sim: eles têm uma piada de matemática lá. O esquema é uma linguagem padronizada de uma maneira que outros LISPs não são. Isso ajuda muito na portabilidade entre implementações, mas não é uma bala de prata. Os esforços de padronização tendem a ser conservadores e as inovações nas implementações, especialmente em torno de módulos, tendem a ser díspares. Há também uma série de SRFIs (solicitações de esquema para implementação) semelhantes ao processo RFC da IETF. As pessoas o usam para padronizar pequenas coisas, conforme necessário.
Os esquemas são diferentes dos LISPs, pois eles têm um conjunto de requisitos rígidos que devem atender, um dos quais é a "otimização da chamada de cauda", que ajuda a tornar a recursão eficiente. Portanto, estilos recursivos de programação são muito mais populares no Scheme do que no LISP. O esquema é, também sem ser cruel, como o "C" do LISP. Ou seja, é um idioma pequeno e você deve manter tudo isso em mente de uma só vez.
Atualmente, existem duas famílias de esquemas: aquelas baseadas na 5ª versão (R5RS) e aquelas baseadas na 6ª versão (R6RS). A complexidade do R6RS era muito maior do que a de qualquer um de seus antecessores, e muitas implementações do R5RS optaram por ignorá-lo, esperando que o R7RS seja mais semelhante ao R5RS do que o R6RS. Atualmente, o processo de padronização do R7RS está em andamento e tentou incluir os desejos dos implementadores do R5RS e os do pessoal do R6RS, padronizando um pequeno idioma de base em seu primeiro grupo de trabalho e, em seguida, contratando um segundo grupo de trabalho para padronizar os recursos maiores. Isso permitirá que o idioma tenha implementações eficientes e úteis tanto em pequenos hardwares incorporados quanto em máquinas mais capazes.
Agora vou ser mais específico:
O PicoLisp é um LISP muito, muito legal. É minúsculo! O autor escreveu para si mesmo e, pelo que entendi, ele vive disso desde a década de 1980. Se você tiver a oportunidade de participar de uma conversa com ele, faça: ele é realmente interessante e realmente conhece as coisas dele, e você não sentirá o menor cheiro de algo mainstream ou chato.
Não estou familiarizado com as implementações do Common Lisp, por isso não comentarei mais sobre elas.
Guile é o esquema oficial do GNU.
O raquete é um esquema do R6RS, mas ultimamente parece ter ampliado a rede e está tentando "servir como plataforma para criação, design e implementação de linguagem".
Frango pretende ser um esquema prático. Ele é baseado no R5RS e é compilado até C. Isso acaba sendo uma vantagem muito, muito importante, pois torna absolutamente trivial o uso de bibliotecas C existentes. Portanto, Chicken é provavelmente o esquema mais útil para substituir Perl, Python, Ruby, etc., como sua linguagem de script do dia-a-dia. Há várias pessoas que o usam exclusivamente para todas as suas necessidades há vários anos. Possui um REPL interativo e um compilador. A comunidade (na lista de discussão e no IRC) é conhecedora, amigável e prestativa.
Procure uma implementação com muitos módulos: isso mostra que é amplamente utilizável e significa que é provável que tenha algo que ajude na tarefa em questão.
Procure uma implementação com um compilador ou, no mínimo, algo que não seja estritamente baseado em IDE ou REPL. Muitas das implementações projetadas para o ensino são muito difíceis de usar para scripts de uso geral.
Eu recomendaria frango como é o que eu uso. Eu o usei em meus projetos pessoais e (e atualmente estou usando) profissionalmente.
O esquema não está profissionalmente morto, mas você pode ter que se esforçar bastante para usá-lo nesse contexto. Algo como Chicken é muito mais do que uma busca acadêmica e pode facilmente cobrir quase todas as bases de qualquer idioma de alto nível usado atualmente.
fonte
Não posso realmente falar por todos os Lisps, mas o Clojure é definitivamente uma linguagem relevante e interessante no momento. Um grupo de usuários do London Clojure que eu freqüentava no início desta semana tinha mais de 100 participantes ....
Eu achei uma experiência muito esclarecedora aprender o Lisp na forma de Clojure no ano passado (depois de muita experiência com Java e C #). Os principais motivos para isso são:
Também parece ser uma opção prática para o uso real da produção pelos seguintes motivos:
Eu, pessoalmente, conheço pessoas que usam o Clojure em alguns bancos de investimento e startups. Também escolhi o Clojure como a principal linguagem de desenvolvimento para minha própria startup, por isso estou disposto a colocar meu dinheiro onde minha boca está :-)
fonte
Atualmente, estou aprendendo Lisp também (e eu amo isso). Eu uso o Common Lisp, mas também brinquei com o SBCL , Arc (observe, é a versão do Lisp para Paul Graham que, como mencionado por Vitor Braga criou a loja do Yahoo / Viaweb) e o Allegro CL, que é semelhante ao Visual Studio for Lisp (pode criar GUIs, no entanto, nunca o usei).
Quanto aos usos, o Lisp tem sido muito utilizado em Inteligência Artificial, mas vou ser sincero, não tenho certeza de quantos outros "gerais" usam para o Lisp. Muitos dos sites que foram criados no Lisp foram reescritos em outros idiomas, por isso é difícil dizer que ele é usado no desenvolvimento da Web (sem dizer que não, mas os sites maiores que o usam não são mais usados). ) Depois de fazer uma pesquisa rápida (muito rápida), aqui está uma lista de softwares escritos em Common Lisp da Wikipedia .
[EDIT] Quanto ao uso profissional do Lisp, existem trabalhos por aí que exigem o uso do Lisp. Eles não são tão numerosos quanto, digamos, trabalhos em Java ou C #, mas existem. Eu acho que o Lisp é uma daquelas linguagens usadas para aplicativos internos e pode fornecer uma vantagem competitiva que as empresas não querem desistir de anunciar que usam o Lisp. Lembro-me de ver um post no P.SE que afirmava que o Smalltalk era semelhante na arena financeira.
Além disso, ser capaz de mostrar que você é capaz de aprender diferentes paradigmas pode abrir mais portas, mesmo que você não use o Lisp no trabalho.
[/EDITAR]
fonte
Se você quiser aprender o Lisp hoje, eu daria uma olhada em qualquer raquete, que é uma implementação rápida do esquema (bem, na verdade ela se afastou um pouco do esquema, portanto, agora é seu próprio dialeto) ou clojure, que se beneficia do A JVM é executada (portanto, há bilhões de bibliotecas disponíveis, além de você poder fazer com que ela interaja com seu próprio código Java).
Mesmo que você não aprenda a usá-lo, aprender sempre é benéfico: você aprende novas maneiras de pensar e lidar com problemas, mesmo em outros idiomas, depois de pensar em Lisp por um tempo.
fonte
Uma parte significativa do back-end da Amazon costumava estar no Lisp, mas agora foi reescrita em C ++, pelo que ouvi dizer (devo admitir que não tenho uma fonte confiável para isso).
Yahoo! Stores é um dos exemplos clássicos de aplicativos da web Lisp. Do Yahoo! Armazena fama que você já deve ter ouvido falar de Paul Graham . Graham é um dos mais conhecidos defensores do Lisp e escreve extensivamente sobre esse assunto. Você pode querer ler o site dele para conhecer seus pontos.
O AutoCAD costumava ter um dialeto Lisp para seu sistema de macro. Não sei se ainda existe.
O esquema é uma linguagem limpa e muito elegante. É provavelmente a minha linguagem de programação favorita, então eu posso ser tendencioso. Se eu ia escrever agora um aplicativo importante, provavelmente escreveria um aplicativo esqueleto em C, estender e definir regras de negócios no Scheme. Isso me permite usar o Scheme e alavancar o C - para velocidade e a grande disponibilidade de bibliotecas para quase tudo.
fonte
Conheço vários caras que fazem Lisps em algumas startups no Vale do Silício e sei que a Amazon.com usa Lisp desde o início (embora eu tenha ouvido falar que eles estão substituindo-o por C ++ por algum motivo?)
Mas uma empresa para ficar de olho é a Naughty Dog . Todos os seus jogos são escritos com um dialeto Lisp. Originalmente, eles criaram seus próprios, mas usam o MZScheme na série Uncharted.
Eu apostaria que Common Lisp, Clojure, Scheme e Emacs Lisp são os quatro dialetos mais usados e, dentre eles, eu suspeitaria que o Scheme é o mais comumente implantado. Não tenho nada com o que apoiar, é claro. :)
Eu gosto bastante do SICP e do Little Schemer, como sugerido por outros, mas também sugiro Land of Lisp , que é uma leitura bastante divertida. :)
fonte
Eu acho que isso depende parcialmente do que você quer fazer com ele - se você está procurando aprofundar suas idéias sobre os vários conceitos de programação e se tornar um programador melhor, então eu diria que vale a pena aprender pelo menos um pouco de Lisp. Se você está procurando outro idioma para adicionar ao seu currículo com o objetivo de conseguir um emprego trabalhando com esse idioma, provavelmente deseja procurar outro lugar. Não existem muitos empregos no Lisp por aí.
Pessoalmente, tentei usar o SBCL ou mais recentemente, o Clojure (e alguns Emacs Lisp, mas isso é porque eu sou um usuário de longo prazo do Emacs - eu tentaria aprender o Emacs Lisp quando tento aprender o Lisp). Agora tudo o que preciso fazer é encontrar tempo para realmente brincar com esses idiomas ...
fonte
Não sei se há muitos empregos no LISP, certamente não consigo vê-los. Mas lembro-me de um longo tempo lendo sobre algumas sondas da NASA onde eles estavam executando o LISP e foram capazes de inserir um novo código da Terra.
Também em Nova York, o grupo de encontros clojure é enorme. Suponho que, se você estiver interessado e for ao seu grupo de encontros de clojure, poderá encontrar oportunidades de criar redes e encontrar empregos (não empregos de clojure, mas coisas como Java / C ++ / etc.). Parece ser absolutamente enorme na área de Nova York, outras áreas podem variar.
Também o LISP é uma maneira diferente de pensar. Além disso, LISP e SQL resultam no uso de toneladas de expressões aninhadas. Eu usei SQL uma tonelada e, em seguida, observe que o LISP fazia mais sentido. Mas se você tiver problemas com o SQL se acostumando a parênteses e expressões super-aninhados ao usar o LISP, provavelmente tornará as expressões SQL muito mais fáceis de descobrir.
Um exemplo clássico é como implementar o MAX (a, b, c). Você pode criar uma função complicada com várias instruções if. Ou você poderia apenas dizer
MAX (MAX (a, b), c)
e use duas chamadas aninhadas simples dos dois itens MAX, o que para mim é mais fácil de ler. Embora se o desempenho for um problema, você também queira fazer o contrário, não me importei em contar o número de comparações ao usar cada método ... Além disso, se você estiver implementando o MAX por meio de uma macro C ou outro método que avalie o expressões várias vezes, você pode não obter o resultado esperado, pois a expressão pode ser avaliada várias vezes, portanto, tenha cuidado com os efeitos colaterais ...
fonte
MAX(MAX(a b) c)
Dois pontos adicionais:
Primeiro, o Lisp é uma ótima linguagem para escrever código no qual as interações entre funções ou dados são frequentemente complexas. Em muitos idiomas populares, se você está confuso sobre o motivo pelo qual seu programa está fazendo o que está fazendo, você precisa escrever funções especiais para permitir que você examine o estado interno do programa à medida que ele avança. Em alguns idiomas, é necessário aguardar a recompilação do seu código. Claro que pode haver ferramentas como depuradores que ajudam com isso. No Lisp, porém, tudo que você precisa é uma maneira de interromper o programa e, normalmente, você tem acesso a tudo no Lisp. No Common Lisp, às vezes digito ^ C ou ligo para
error
em uma única função (que é a única coisa que deve ser recompilada e você não precisa fazer nada para recompilar). Depois que paro o programa, sou instantaneamente jogado em um depurador - mas o depurador me dá todo o poder do Lisp e posso sair do depurador, chamar funções específicas, etc. Posso examinar facilmente qualquer uma das estruturas de dados no meu programa. A maioria dos esquemas deve permitir práticas semelhantes. O Lisp não é único nesse aspecto, mas o que oferece vai além do que muitos idiomas populares oferecem.Segundo: se você quiser experimentar qualquer dialeto do Lisp, eu não faria isso sem (a) usar um editor que combine parênteses e (b) aprender o recuo apropriado do Lisp. Seria uma boa ideia usar um editor que também se aproximasse da indentação adequada. A formatação de código no estilo C / C ++ / Java foi projetada para idiomas com menos parênteses / chaves / colchetes que o Lisp. O estilo bonito de impressão Lisp funciona bem quando você está familiarizado com ele, e você não fica confuso com parênteses ou perde metade do seu espaço, colocando um parêntese de fechamento por linha.
fonte
No momento, tenho a impressão de que o Lisp é usado principalmente em consultorias (não que as consultorias o utilizem principalmente).
É considerado um pouco exagerado para softwares práticos. Principalmente porque as pessoas não estão acostumadas, acredito.
Tradicionalmente, Scheme é um dialeto bastante acadêmico do Lisp, e o Common Lisp era o dialeto da indústria.
O Lisp é particularmente útil para manipulação simbólica e recursos de reflexão.
Como exemplo, o código que escrevi para aprender o Lisp era um programa que construía funções lambda aleatórias, as avaliava e depois operava nelas, na tentativa de minimizar a diferença da função com uma função de destino. Tudo isso foi manipulação direta. Em uma linguagem como C ++ ou Java, eu teria que inventar uma representação para as funções que o computador manipularia.
fonte
Eu gostaria de adicionar uma perspectiva sobre o Common Lisp e Scheme. Evitei o clojure devido à JVM, por isso não tenho muita perspectiva.
O esquema é uma bela linguagem concisa e bem definida. Foram necessárias muitas decisões que o CL teve que tomar devido ao legado e adotou a abordagem mais pura. Por exemplo, variáveis e funções estão no mesmo espaço para nome. O idioma padrão é menor e mais conciso, o que funciona bem para ensinar a você o tipo de coisa em que o lisp é bom, por exemplo, pressiona o uso de recursão em vez de iteração, já que, por padrão, não possui loops iterativos e requer otimização de chamada de cauda . O esquema possui um macro sistema higiênico muito interessante, que vale muito a pena aprender. Mas, na IMO, eu recomendaria aprender macros anti-higiênicas no estilo CL primeiro, das quais a maioria dos dialetos de esquema (?) Oferece pelo menos uma implementação, mesmo que isso não faça parte das especificações. Como parece muito que você deseja aprender um idioma pelo bem da aprendizagem, eu
Dito isto, a comunidade do Scheme é fragmentada e, exceto em alguns pequenos bolsos, parece ser dedicada principalmente à pesquisa sobre a realização de um trabalho real ... Por exemplo, todo dialeto tem seu próprio gerenciador de pacotes, e os pacotes geralmente não são portáteis através dos dialetos, o que é um grande problema na comunidade do esquema.
O Lisp comum, por outro lado, parece ser a abordagem muito mais pragmática do desenvolvimento de uma linguagem. O padrão é tal que muitos códigos lisp são portáveis entre implementações, muitos compiladores são rápidos e bem otimizados. Há um grande conjunto de pacotes, muitos dos quais são portáveis entre implementações. E aparentemente uma quantidade (comparativamente) grande de produtos reais está sendo criada no idioma. E com o say quicklisp, seu gerenciamento de pacotes parece razoavelmente próximo ao que você obteria em uma comunidade moderna como, por exemplo, Ruby ou Node. CL, no entanto, não tem falhas, neste momento, ele tem uma especificação muito grande em comparação com o esquema, e mesmo o sistema de objetos CLOS, algo que é tradicionalmente escrito como uma biblioteca em Lisps, faz parte do IIRC de especificações. E você pode se sentir herdado de uma grande quantidade do sistema.
Caso contrário, eu disse que não poderia falar sobre clojure, e o Emacs Lisp é claramente a escolha apropriada se seu objetivo é escrever extensões do Emacs, e claramente não é a escolha apropriada para outro software.
TLDR; Se seu objetivo é aprender, recomendo o esquema. No entanto, se você deseja criar um software, recomendo o Common Lisp das duas principais variantes do lisp.
fonte
Eu aprendi muito com as respostas. Obrigado a todos que contribuíram para esta conversa esclarecedora.
Eu devo mencionar newLISP . Embora seja um pouco diferente do CL e do Scheme, ele implementa muitas funções muito úteis. Acho o servidor http, a funcionalidade de multiprocessamento (Cilk) e as funções de avaliação remota muito limpas e fáceis de usar.
O único executável é pequeno, rápido e inclui muitas baterias frias.
fonte
Outro fator a considerar na escolha de qual dialeto do Lisp aprender pode ser o número e a qualidade das implementações. Se um dialeto tiver apenas uma ou duas implementações, você ficará preso a essas falhas até que elas sejam corrigidas e sempre haverá uma chance de as pessoas pararem de refinar a implementação. Por si só, esse não é um motivo para não usar um dialeto de implementação única do Lisp, mas é algo a ser levado em consideração. Uma vantagem do Scheme e do Common Lisp é que existem muitas implementações desses dialetos. Os dois idiomas publicaram padrões, portanto, implementações relativamente recentes provavelmente executam o mesmo código, principalmente. Algumas dessas implementações já existem há muito tempo, mas ainda estão em desenvolvimento ativo: agora são implementações de alta qualidade e ainda estão sendo refinadas.
fonte