O LISP ainda é útil no mundo de hoje? Qual versão é mais usada?


117

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:

  1. 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?

  2. 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 ...


10
Estou muito interessado nesta questão. De vez em quando, quando tenho tempo, decido tentar aprender o Lisp. E toda vez que sou frustrado pelo mesmo tipo de perguntas e incertezas que você está perguntando aqui. Qual versão do Lisp devo aprender? Alguém (além de Paul Graham) realmente usa o Lisp? Devo aprender Lisp, ou uma das linguagens de programação funcional mais recentes, como Haskell? Quais são os benefícios do Lisp sobre Scheme, etc., etc.
Channel72


Lisp prático comum: gigamonkeys.com/book
Joe Internet

"ainda"? (Eu brinco!)
jhocking

Acabei de encontrar este outro, linha relacionada no SO: stackoverflow.com/q/1614724/212942
TCSGrad

Respostas:


59

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/


Existe um dialeto que funciona bem com C / C ++, pois eu sou principalmente um cara de C ++? Você também poderia mencionar alguns recursos para um novato, para começar a aprender esse dialeto?
TCSGrad 06/03

10
Os melhores livros para aprender esquema são "The Little Schemer" e "SICP" mitpress.mit.edu/sicp . Existem várias implementações de esquema que podem ser incorporadas no c / c ++, mas eu realmente não sei quais são boas atualmente, portanto, talvez você precise pesquisar no Google.
Zachary K

1
Devo salientar que o esquema é muito simples! você aprenderá cerca de 90% da língua em 2 horas. É claro que isso não significa que você o tenha dominado, apenas saberá como a sintaxe funciona.
Zachary K

5
O esquema shan23 foi desenvolvido para o ensino. Sem dúvida, poderia ser usado para ensinar um calouro a programar, então não tenho dúvidas de que você não terá problemas em aprender. Se você deseja integração C ou C ++, consulte Guile ( pt.wikipedia.org/wiki/GNU_Guile ).
Vitor Py

1
O livro de linguagem de programação Scheme de Kent Dybvig talvez não seja tão famoso, mas é um livro muito bom. schema.com/tspl4 Se você usa o Emacs, aprender um pouco do Lisp é útil.
21813 Blispr

68

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

  • Possivelmente esquema (todos os dialetos) por causa de aplicações educacionais
    • 270 escolas ... Vamos adivinhar 50 alunos / ano, 500 linhas de código / aluno, 10 anos consecutivos. Mais de 1.000.000 de linhas baseadas em matemática de guardanapos.
    • 500.000 linhas de raquete na própria raquete e suas ferramentas.
  • Possivelmente Lisp comum por causa da IA e um monte de código-fonte aberto e código de produção (consulte o código de produção).
  • Possivelmente Emacs Lisp por causa de ...
    • Emacs: mais de 1.000.000 de linhas
    • A quantidade de emacs lisp escrita publicamente - 237 módulos, cerca de 200 linhas / módulos são mais de 40.000 linhas apenas no EmacsWiki, provavelmente muito mais no ELPA
    • Além disso, aplicativos escritos em emacs Lisp, arquivos .emacs, etc.
  • Clojure
    • Difícil de estimar. Dotcoms principalmente menores. Pode ser muito.

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

  • Lisp comum
    • Clientes da ITA Software, incluindo Orbitz, Bing Travel e Kayak.com - provavelmente milhões.
  • Clojure
    • Citigroup (sem detalhes), Akamai (sem detalhes), simple.com, muitos outros. Provavelmente milhões.
  • Esquema
    • Estudantes de CS, pesquisadores e entusiastas. Menos de um bazilhão.
    • A série Uncharted - Mais de 5 milhões
  • Emacs Lisp - Principalmente programadores, principalmente em plataformas unix. Pode ser um milhão.

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.


4
Laranjas não pequenas? Ou limões purpreen?
Vatine 8/03

De fato, o esquema - especialmente o sistema de raquetes - parece ser o dialeto cigano mais atualizado. Ferramentas e bibliotecas de nível profissional.
Bikal Lem

@Bikal Gostaria que o suporte a OpenGL não foi tão datada, mas, em seguida, de modo direto não é o maior defeito do meu código Racket ...
Jesse Millikan

Não tinha idéia de que Orbitz usava CL ... Eu sei onde procurar meu próximo emprego: D
Rig

2
Muito mais que 100k LOC foram escritos em Raquete. A biblioteca / IDE / ferramentas padrão da Racket tem mais de 500k, além de ser usada em empresas como SET, Boeing e Naughty Dog.
Sam Tobin-Hochstadt 22/02

43

O LISP ainda é praticado / usado no mundo de hoje ou é uma linguagem herdada

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.

Qual é o dialeto mais usado?

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.

Eu 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 ...

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.


3
A raquete não é um esquema R6RS; existe um entre os idiomas que a distribuição Racket fornece. A linguagem Racket atual é um esquema que parte do RnRS de várias maneiras importantes (sobre as quais tenho sentimentos contraditórios).
21413 JasonFruit

27

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:

  • Ele tem uma forte ênfase na programação funcional (mais do que na maioria dos outros Lisps). O autor e BDFL Rich Hickey citou frequentemente Haskell como uma de suas inspirações para o design da linguagem, o que significa que você obtém coisas como estruturas de dados totalmente imutáveis ​​e sequências infinitas e preguiçosas etc.
  • Metaprogramação de macros - a filosofia "código é dados" do Lisp é difícil de entender, a menos que você realmente tenha experimentado, mas esse é um dos motivos pelos quais os Lisps são tão expressivos e produtivos
  • Suporte fantástico para simultaneidade de vários núcleos - acho que o Clojure é a melhor linguagem para programação simultânea no momento. Consulte http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey para uma apresentação esclarecedora sobre isso.

Também parece ser uma opção prática para o uso real da produção pelos seguintes motivos:

  • A execução na JVM com interoperabilidade Java muito fácil fornece acesso a todas as bibliotecas e ferramentas no ecossistema Java
  • Por padrão, é uma linguagem dinâmica , o que a torna muito conveniente para o desenvolvimento e a criação rápida de protótipos, com praticamente nenhum clichê. No entanto, você pode adicionar dicas de tipo estático para obter um bom desempenho onde você precisar.

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á :-)


9

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.

"O Lisp vale a pena aprender pela profunda experiência de iluminação que você terá quando finalmente obtê-la; essa experiência o tornará um programador melhor para o resto dos seus dias, mesmo que você nunca use muito o Lisp." - Eric Raymond, "Como se tornar um hacker"

[/EDITAR]


7
FWIW, SBCL é uma implementação do Common Lisp e também o Allegro CL.
Vatine 8/03

@Vatine - você estaria correto. Se houvesse um rosto corado, eu o faria agora. Não sei por que presumi que eram diferentes. Estúpido me compilador diferente! = Dialeto diferente :) Obrigado!
1111 Jetti

@ Jeff: Bem, os dois estendem o idioma em direções diferentes, deixando o "núcleo CL" interoperável.
Vatine 9/03

@Jetti O que você estava usando em primeiro lugar?
Mark C

Acredito que estava usando o CLISP, estava em uma imagem de VM que não tenho mais. Eu acho que a minha ignorância me fez acreditar que era covarde comum. Pelo menos agora eu sei melhor.
Jetti

8

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.


3
O problema com o esquema é que, quando você começa a praticar, não deseja voltar para outros idiomas. Eu apenas comecei a implementar fluxos (possivelmente infinitas, sequências imutáveis, avaliadas preguiçosamente) em C ++ e isso é muito mais código do que em Scheme! Fiquei realmente surpreso com a combinação de simplicidade e poder de Scheme.
Giorgio

++ para raquete. É realmente incrivelmente COMPLETO, que é uma das críticas de outros esquemas. E vai além do que o esquema pode fazer em relação à criação de seus próprios idiomas.
Scott Klarenbach

7

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.


O que você recomendaria como um livro / compilador para o Scheme? Eu uso Linux, por isso, se há qualquer editor que é explicitamente útil para novatos, (como Kile é para látex), deixe-me saber ...
TCSGrad

1
@ shan23 O Little Schemer ( ccs.neu.edu/home/matthias/BTLS ) é sua melhor aposta. Acredito que o emacs é o editor mais comum do Scheme, mas leva um tempo para se acostumar.
Vitor Py

1
Editor para lisp, isso é fácil, use o emacs. Foi escrito por caras lisp, e em lisp.
Zachary K

Você também pode usar o Racket IDE ( racket-lang.org ); é semelhante ao Emacs, mas possui formatação automática e interação com o intérprete do esquema.
Jeremiah Willcock

O Lispbox ( common-lisp.net/project/lispbox ) funciona imediatamente (algumas experiências com o emacs são úteis). Baseia-se em ccl ( ccl.clozure.com ), consulte também gigamonkeys.com/book/…
Giorgio

4

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?

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.

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.

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. :)


De fato, Land of Lisp é uma leitura incrível.
Chiron

@ 4bu3li Y u no upvote?
Mark C

1
Sobre o Naughty Dog: Isso não está totalmente correto, seus jogos para PS2 foram escritos em GOAL, uma linguagem parecida com a cólica ... Mas desde que mudaram para o PS3, eles passaram a usar C ++. O MZScheme é usado principalmente como pré-processador de macro, escrito em linha com C ++, e usado para algum processamento de ativos, e alguns de seus scripts são escritos em S-exps. Mas nenhum código MZScheme é executado no PS3.
Arelius

2

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 ...


1
É principalmente o primeiro ... como é bastante evidente que, se eu conseguir, certamente não vai prejudicar meu currículo :). Mas, falando sério, quero uma perspectiva sobre os diferentes "estilos" de programação, para ter uma boa idéia de qual usar em diferentes cenários (não quero cair na situação de estar equipado apenas com um martelo, Eu tenho que tratar todos os problemas como pregos !!)
TCSGrad

2

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 ...


3
Você pode realmente simplificar o MAX porMAX(MAX(a b) c)
Andrea Andrea

Você está certo, é isso que recebo por responder logo após acordar. Eu ajustei a resposta.
Cervo

2
O projeto NASA foi Deep Space 1: flownet.com/gat/jpl-lisp.html
Frank Shearar

2

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 paraerrorem 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.


1

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.


Ponto interessante que você fez sobre as diferenças entre Scheme / Common Lisp - você poderia elaborar o porquê / como?
TCSGrad


1

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.


BTW, PLT Racket é uma linguagem que é mais semelhante ao esquema, e originalmente da comunidade de esquemas que parece estar tentando ser útil para o trabalho real. Se eu escrevesse um código em um esquema hoje em dia, provavelmente seria PLT ou Chicken Scheme, mas o último pode ser devido a um problema no meu coração.
Arelius

0

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.


Provavelmente é justo mencioná-lo, mas eu não o recomendaria exatamente ... Sem escopo lexical e sem módulos, por exemplo - sério? Eu realmente não entendo o que o newLISP está tentando realizar.
Cji 23/02

2
Você está certo - é diferente. Ele usa contextos e escopo dinâmico e, da minha experiência, os módulos e contextos estão inter-relacionados. Ele não tenta ser outro CL nem esquema. A leitura da página sobre a diferença ( newlisp.org/index.cgi?page=Differences_to_Other_LISPs ) lança luz sobre os problemas de design. Da mesma forma, eu não recomendaria a ninguém que queira uma experiência em CL ou Scheme. Mas, para alguns casos de uso, pode ser uma opção viável. Essa é a beleza do ecossistema de código aberto - muitas opções de escolha!
CyberFonic 28/02

0

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.


Bem de acordo com esse benchmarks Clojure está fazendo não muito ruim em comparação com SBCL: benchmarksgame.alioth.debian.org/u32/...
AndreasScheinert

Obrigado Andreas. Você está certo. Mostra o quanto eu sei sobre a JVM - não muito. Em parte, fui enganado pelo ABCL, um CL baseado em JVM relativamente lento, mas de outro modo agradável.
Mars

Eu diria que se você quer um Lisp na JVM, escolha Clojure. Não é perfeito, mas é um verdadeiro prazer (IMHO)
AndreasScheinert
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.