Por que eu deveria aprender o Lisp? [fechadas]

125

Eu realmente sinto que devo aprender o Lisp e há muitos recursos bons por aí para me ajudar a fazê-lo.

Eu não estou desanimado com a sintaxe complicada, mas onde na "programação comercial tradicional" eu encontraria lugares onde faria sentido usá-lo em vez de uma linguagem processual.

Existe um aplicativo comercial assassino por aí escrito em Lisp?

David
fonte
5
Difícil de se deixar levar pelo que não existe.
Kaz
Leia o currículo de Philip Greenspun . É repleto de trabalhos reais em Lisp.
Kaz
1
Também aqui . Greenspun trabalhou na simulação de rede comutada por pacotes, design DSP, design de processador, layout VLSI, automação de engenharia mecânica, automação de movimentação de terra e assim por diante, todos usando Lisp ou envolvendo Lisp. Ele ajudou a projetar a arquitetura PA-RISC da Hewlett Packard usando ferramentas desenvolvidas em uma máquina Lisp.
Kaz
Aqui estão alguns aplicativos desenvolvidos em Lisp - Emacs, G2, AutoCad, Igor gravador e Yahoo Store
Arulx Z

Respostas:

55

Um dos principais usos do Lisp está na Inteligência Artificial. Um amigo meu na faculdade fez um curso de IA de pós-graduação e, para seu projeto principal, ele escreveu um solucionador de " Lights Out " em Lisp. Várias versões de seu programa utilizaram rotinas de IA ligeiramente diferentes e os testes em 40 computadores produziram alguns resultados bastante interessantes (eu gostaria que estivesse online em algum lugar para eu vincular, mas acho que não).

Dois semestres atrás, usei o Scheme (uma linguagem baseada no Lisp) para escrever um programa interativo que simulava a rotina "Who's on First" de Abbott e Costello. A entrada do usuário foi comparada com algumas estruturas de dados bastante complicadas (semelhantes a mapas em outros idiomas, mas muito mais flexíveis) para escolher qual seria uma resposta apropriada. Também escrevi uma rotina para resolver um quebra-cabeça de slides 3x3 (um algoritmo que poderia ser facilmente estendido para quebra-cabeças de slides maiores).

Em resumo, aprender Lisp (ou Scheme) pode não gerar muitas aplicações práticas além da IA, mas é uma experiência de aprendizado extremamente valiosa, como muitas outras afirmaram. Programar em uma linguagem funcional como o Lisp também ajudará você a pensar recursivamente (se você teve problemas com a recursão em outros idiomas, isso pode ser uma grande ajuda).

Justin Bennett
fonte
5
Por que você diz que o Lisp é bom apenas para IA? Além disso, é uma linguagem com vários paradigmas. Funcional é apenas um dos vários paradigmas que ele possibilita.
Luís Oliveira
6
Eu não disse que era usado apenas para IA, eu disse que um de seus principais usos é a IA. Você leu?
Justin Bennett
32
"Por favor, não assuma que o Common Lisp é útil apenas para bancos de dados, estruturas de teste de unidade, filtros de spam, analisadores ID3, programação na Web, servidores Shoutcast, intérpretes de geração de HTML e compiladores de geração de HTML apenas porque essas são as únicas coisas que foram implementadas no o livro Practical CL "
Mikael Jansson
23
@JustinBennett sim, você disse isso. Aqui: "Em resumo, aprender Lisp (ou Scheme) pode não produzir muitas aplicações práticas além da IA". Eu odeio quando as pessoas se confrontam enquanto estão erradas.
Luka Ramishvili
127

Lisp é uma linguagem grande e complexa com um tempo de execução grande e complexo para suportá-lo. Por esse motivo, o Lisp é mais adequado para problemas grandes e complicados.

Agora, um problema complexo não é o mesmo que um problema complicado . Um problema complexo é aquele com muitos pequenos detalhes, mas que não é difícil. Escrever um sistema de reservas de companhias aéreas é um negócio complexo, mas com dinheiro e programadores suficientes não é difícil. Entendeu a diferença?

Um problema complicado é aquele que é complicado, onde o tradicional dividir e conquistar não funciona. Controlando um robô ou trabalhando com dados que não são tabulares (idiomas, por exemplo) ou situações altamente dinâmicas.

O Lisp é realmente adequado para problemas em que a solução deve ser expansível; o exemplo clássico é o editor de texto emacs. É totalmente programável e, portanto, um ambiente de programação por si só.

Em seu famoso livro PAIP , Norvig diz que o Lisp é ideal para programação exploratória. Ou seja, programar uma solução para um problema que não é totalmente compreendido (em oposição a um sistema de reservas on-line). Em outras palavras: problemas complicados.

Além disso, aprender Lisp o lembrará de algo fundamental que foi esquecido: a diferença entre Von Neumann e Turing. Como sabemos, o modelo de computação de Turing é um modelo teórico interessante, mas inútil como modelo para projetar computadores. Von Neumann, por outro lado, projetou um modelo de como os computadores e a computação deveriam ser executados: o modelo de Von Neumann. O ponto central do modelo de Von Neumann é que você tem apenas uma memória e armazena seu código e seus dados lá. Observe com cuidado que um programa Java (ou C #, ou o que você quiser) é uma manifestação do modelo de Turing. Você define seu programa em concreto, de uma vez por todas. Então você espera poder lidar com todos os dados lançados nele.

Lisp mantém o modelo de Von Neuman; não há borda nítida e pré-determinada entre código e dados. A programação no Lisp abre sua mente para o poder do modelo de Von Neumann. A programação no Lisp faz com que você veja conceitos antigos sob uma nova luz.

Por fim, sendo interativo, você aprenderá a interagir com seus programas à medida que os desenvolve (em vez de compilar e executar). Isso também altera a maneira como você programa e como vê a programação.

Com esta introdução, finalmente posso oferecer uma resposta à sua pergunta: Você encontrará lugares onde ela supera os idiomas "tradicionais"?

Se você é um programador avançado, precisa de ferramentas avançadas. E não há ferramenta mais avançada que o Lisp. Ou, em outras palavras: a resposta é sim se seus problemas forem difíceis. Não de outra forma.

user7517
fonte
30
"mas com dinheiro e programadores o suficiente, não é difícil" - o que disse, dado suficientemente muitos programadores torna-se impossível ;-)
Jonas Kolker
Eu li sobre a capacidade do lisps de gerar código rapidamente, mas também li que ele pode ser compilado. Existem implementações que podem misturar execução interpretada e compilada? ou quais contêm o próprio compilador?
centaurian_slug
@centaurian_slug: Sim, absolutamente. Isso faz parte do poder. Qualquer versão que não tenha sido deliberadamente aleijada terá seu compilador / intérprete disponível em tempo de execução. Assim, por exemplo, um desenvolvedor pode fazer login em uma conexão especial em seu servidor da Web, fazer alguma depuração, atualizar algumas definições de classe e função e, possivelmente, recompilar o que quer que esteja dependendo dessas definições, se necessário. Enquanto o servidor estiver em funcionamento. Provavelmente não legal em uma empresa preocupada com a conformidade SOX, mas isso é um indústrias razão usar linguagens braindead como Java e C #
James
46

sintaxe complicada ??

A sintaxe do lisp é incrivelmente simples .

Aplicativo assassino escrito em lisp: emacs . O Lisp permitirá que você estenda o emacs à vontade para fazer praticamente qualquer coisa que um editor possa fazer.

Porém , você só deve aprender cisco se quiser , e talvez nunca consiga usá-lo no trabalho, mas ainda é incrível.

Além disso, quero acrescentar: mesmo que você encontre lugares onde o lisp fará sentido, você provavelmente não convencerá mais ninguém que ele deve ser usado sobre java, c ++, c #, python, ruby, etc.

Justin Standard
fonte
@ Justin: Provavelmente vale a pena notar que o emacs core está escrito em C. Mas isso é apenas uma escolha - todos os comandos estão escritos em elisp.
7288 Bernard
3
ou melhor, a sintaxe principal do lisp comum é simples. defmacro permite estender a sintaxe, e algumas das macros incorporadas (como defmacro) podem ficar incrivelmente complicadas; listas lambda, aspas aninhadas etc.
Aaron
É quase justo dizer que a parte C do emacs é um código de cola.
Luka Ramishvili
De acordo com o manual de referência do Emacs, "A maioria dos comandos de edição no Emacs são escritos no Lisp; as poucas exceções podem ter sido escritas no Lisp, mas use C em vez de eficiência". gnu.org/software/emacs/manual/html_mono/emacs.html#Intro
dpritch
25

Não posso responder por experiência própria, mas você deve ler o que Paul Graham escreveu no Lisp . Quanto à parte "killer-app", leia Batendo as médias .

Christian Lescuyer
fonte
2
+1. Esta resposta deve mencionar o Yahoo Stores, o primeiro aplicativo da web, parcialmente escrito em lisp. Citando a Wikipedia: em 1998, o Yahoo! Inc. comprou a Viaweb por 455.000 ações do Yahoo! ações, avaliadas em cerca de US $ 49 milhões, e renomeou-o como Yahoo! Loja.
Steven Lu
17

Programei profissionalmente em Lisp por cerca de um ano, e definitivamente vale a pena aprender. Você terá uma oportunidade incomparável de remover a redundância do seu código, podendo substituir todo o código padrão por funções sempre que possível e macros onde não. Você também poderá acessar uma flexibilidade incomparável em tempo de execução, traduzindo livremente entre código e dados. Assim, situações em que as ações do usuário podem desencadear a necessidade de construir estruturas complexas dinamicamente é onde o Lisp realmente brilha. Os agendadores de vôos de companhias aéreas populares são escritos em Lisp, e também há muito CAD / CAM em Lisp.

John com waffle
fonte
9

Se você gosta de programar, deve aprender o Lisp pela pura alegria. O XKCD expressa perfeitamente a iluminação intelectual que se segue. Aprender Lisp é para o programador o que é meditação para o monge budista (e eu quis dizer isso sem nenhuma conotação blasfema).

Konrad Rudolph
fonte
9

O Lisp é muito útil para criar pequenos DSLs. Eu tenho uma cópia do Lisp in a Box funcionando no trabalho e escrevi pequenas DSLs para interrogar os bancos de dados do SQL Server e gerar camadas de dados etc. em C #. Todo o meu código da placa da caldeira agora está escrito em macros lisp que são exibidas em C #. Eu gero HTML, XML, todo tipo de coisas com ele. Enquanto eu gostaria de poder usar o Lisp para a codificação diária, o Lisp pode trazer benefícios práticos.

Phil Bennett
fonte
Eu uso dotlisp.sourceforge.net/dotlisp.htm para isso.
Mark Hurd
5

Qualquer idioma parece muito mais difícil quando não se usa as convenções de recuo comuns de um idioma. Quando se segue o Lisp, vê-se como ele expressa uma estrutura de árvore de sintaxe com bastante facilidade (observe, isso não está certo porque a visualização fica um pouco; os r devem alinhar-se com o fns no argumento recursivo do quicksort):

(defun quicksort (lis) 
  (if (null lis) 
      nil
      (let* ((x (car lis)) 
             (r (cdr lis)) 
             (fn (lambda (a) 
                   (< a x))))
         (append (quicksort (remove-if-not fn 
                                           r)) 
                 (list x)
                 (quicksort (remove-if fn 
                                       r))))))
John com waffle
fonte
1
Eu acho que há uma crítica justa no que você diz. Quero apenas dizer "parece muito mais difícil como você a apresentou e parece muito mais claro como é apresentado aqui". Eu acho que você teria que concordar que muitos idiomas parecem muito mais confusos se suas convenções de indentação não forem seguidas. Além disso, se compararmos a indentação de, digamos, Java e Lisp, eu diria que eles geralmente requerem aproximadamente o mesmo nível de conhecimento das construções básicas de cada linguagem para identá-las corretamente. Mas, é justo, embora inteiramente subjetivo, dizer que ainda parece difícil.
John com waffle
1
Para simplificar um pouco, você pode usar o padrão lete usar a defunno início da função para definir fncomo ela não muda.
Aaron Robson
4
@FerretallicA Com que base você determina se algo é “facilmente legível por humanos” ou “auto-descritivo”? Semelhança com o inglês? O chinês é "facilmente legível por humanos"? E a notação matemática? "Não é facilmente legível por humanos"? Esse tipo de argumento é irritante, porque sua mensagem oculta é: "Isso não parece com o que aprendi a raciocinar".
3
Mais como sua "refutação" soa como "Whinge whinge". Experimente o teste de detecção da linguagem de programação. Pegue alguém que não tenha programado antes e mostre a eles uma página do código VB e uma página do código Lisp. Felizmente, aposto na minha porca esquerda em qual dos dois o observador casual será mais facilmente capaz de extrair observações significativas.
Nathanchere
1
Eu me pergunto o que um não programador chinês, japonês, coreano, sumério, hindi ou árabe pensaria em seu desejo bastante ousado de desistir de seu testículo por um argumento fácil.
4

Descobri que aprender uma nova linguagem sempre influencia seu estilo de programação em linguagens que você já conhece. Para mim, sempre me fez pensar de maneiras diferentes para resolver um problema na minha linguagem principal, que é o Java. Eu acho que, em geral, apenas amplia seu horizonte em termos de programação.

dlinsin
fonte
É porque você é um bom programador. Os programadores ruins, em vez de influenciar habilidades antigas com novos conhecimentos, pensam em idiomas já conhecidos enquanto escrevem em novos. Mas por que você está usando Java após o lisp? :) O Java é mais difícil de usar depois do Lisp, imo.
Luka Ramishvili
4

Se você tiver que se perguntar se deve aprender o cisco, provavelmente não precisará.

Desconhecido
fonte
8
Eu diria o contrário: se você já entende o lisp porque tem experiência com uma linguagem semelhante, provavelmente não é necessário. Se você não entender o que o lisp tem a oferecer, poderá se beneficiar da exposição.
Sr. Fooz
@ MrFooz não há idiomas semelhantes que possam remover a necessidade de aprender a parte lispy do lisp. Os principais recursos do lisp não são encontrados em nenhum idioma. Embora a maioria seja.
Luka Ramishvili
Dependendo dos seus objetivos. Se você quer morrer, não precisa respirar. Mas isso não significa que você não deveria.
Mimoralea 27/05
4

Tomei uma "aula cega" na faculdade nos anos oitenta. Apesar de ter grokking todos os conceitos apresentados na aula, fiquei sem nenhuma apreciação pelo que torna o cocô ótimo. Receio que muitas pessoas considerem o lisp apenas mais uma linguagem de programação, que é o que esse curso na faculdade fez por mim há muitos anos. Se você vir alguém reclamando da sintaxe do cisco (ou da falta dele), há uma boa chance de que seja uma daquelas pessoas que falharam em compreender a grandeza do cisco. Eu fui uma dessas pessoas por muito tempo.

Não foi até duas décadas depois, quando reacendi meu interesse pelo lisp, que comecei a "entender" o que torna o lisp interessante - para mim de qualquer maneira. Se você conseguir aprender cocô sem ter sua mente soprada por fechamentos e macros, provavelmente você não entendeu.

fdesmet
fonte
Eu concordo. Atualmente, estou na minha segunda incursão em Lisp, 5 anos depois da escola. Um termo do Lisp quando você ainda é verde pode não ter efeito adequado - lembro-me de focar apenas na metaprogramação e ainda não apreciava a metaprogramação e a flexibilidade.
Aaron
4

Aprender LISP / Esquema pode não oferecer mais espaço para aplicativos, mas ajudará você a ter uma melhor noção da programação funcional, suas regras e exceções.

Vale a pena investir tempo apenas para aprender a diferença na beleza de seis funções puras aninhadas e o pesadelo de seis funções aninhadas com efeitos colaterais.

JT Hurley
fonte
4

De http://www.gigamonkeys.com/book/introduction-why-lisp.html

Um dos mitos mais comumente repetidos sobre Lisp é que ele está "morto". Embora seja verdade que o Common Lisp não seja tão amplamente usado como, digamos, Visual Basic ou Java, parece estranho descrever uma linguagem que continua sendo usada para novos desenvolvimentos e que continua atraindo novos usuários como "mortos". Algumas histórias de sucesso recentes da Lisp incluem a Viaweb, de Paul Graham, que se tornou o Yahoo Store quando o Yahoo comprou sua empresa; O sistema de preços e compras de passagens aéreas da ITA Software, QPX, usado pelo vendedor de bilhetes online Orbitz e outros; O jogo da Naughty Dog para o PlayStation 2, Jak e Daxter, que é amplamente escrito em um dialeto Lisp específico do domínio que a Naughty Dog inventou chamado GOAL, cujo compilador é ele próprio escrito em Common Lisp; e o Roomba, o aspirador de pó robótico autônomo, cujo software está escrito em L, um subconjunto do Common Lisp compatível com versões anteriores. Talvez ainda mais revelador seja o crescimento do site Common-Lisp.net, que hospeda projetos Common Lisp de código aberto, e o número de grupos de usuários locais do Lisp surgidos nos últimos anos.

krdluzni
fonte
4

"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 S. Raymond, "Como se tornar um hacker"

http://www.paulgraham.com/avg.html

eric.christensen
fonte
3

Concordo que o Lisp é um desses idiomas que você nunca pode usar em um ambiente comercial. Mas, mesmo que você não o consiga, o aprendizado definitivamente expandirá sua compreensão da programação como um todo. Por exemplo, eu aprendi Prolog na faculdade e, embora nunca o tenha usado, me deu uma compreensão maior de muitos conceitos de programação e (às vezes) uma apreciação maior pelas linguagens que uso.

Mas se você vai aprender ... por todos os meios, leia On Lisp

Adam Haile
fonte
Nota: No Lisp não é uma introdução adequada ao Lisp, leia outra coisa primeiro. Eu recomendo o prático Common Lisp.
Luís Oliveira
3

Aprender lisp colocará o Javascript sob uma luz completamente diferente! O Lisp realmente obriga você a entender a recursão e o paradigma "funções como objetos de primeira classe". Veja o excelente artigo de Crockfords sobre Scheme vs Javascript . O Javascript é talvez o idioma mais importante hoje em dia, portanto, entendê-lo melhor é imensamente útil!

Erlend Halvorsen
fonte
1
O idioma mais importante? Eu acho que não, senhor.
TraumaPony
7
Bem, ele está disponível em praticamente qualquer dispositivo que tenha um navegador da Web (e provavelmente alguns que não o fazem); portanto, no que diz respeito aos idiomas para aplicativos de usuários finais, ele provavelmente possui a maior penetração de qualquer linguagem de programação do planeta. . Obviamente, você poderia ter uma opinião totalmente diferente sobre o que é importante. Será usado para curar o câncer? Provavelmente não. Mas, goste ou não, será uma das pedras angulares do desenvolvimento de aplicativos (web) nos próximos anos.
Erlend Halvorsen
1
Eu segui o mesmo caminho! Embora eu já estivesse usando os recursos funcionais e de prototipagem do Javascript, depois de aprender o Lisp Javascript era uma nova linguagem para mim.
Luka Ramishvili
3

O Script-Fu de Gimp é de lábios. Esse é um aplicativo matador de photoshop.

Peter Turner
fonte
3

Ok, eu posso ser estranho, mas eu realmente não gosto muito dos ensaios de Paul Graham e no Lisp é um livro muito difícil, se você ainda não conhece o Common Lisp. Em vez disso, eu diria que vá para o Common Lisp prático da Siebel . Quanto aos "killer-apps", o Common Lisp parece encontrar seu lugar em nichos de lojas, como o ITA , portanto, embora não exista um aplicativo sinônimo de CL do jeito que o Rails é para Ruby, há locais na indústria que o usam se você o fizer um pouco de escavação.

C Hogg
fonte
2

Sintaxe complicada? A beleza do lisp é que ele possui uma sintaxe ridiculamente simples. É apenas uma lista, onde cada elemento da lista pode ser outra lista ou um tipo de dados elementar.

Vale a pena aprender por causa da maneira como aprimora sua capacidade de codificação para pensar e usar funções como apenas outro tipo de dados. Isso melhorará a maneira como você codifica em uma linguagem imperativa e / ou orientada a objetos, porque permitirá que você seja mais flexível mentalmente com a forma como seu código está estruturado.

Antonio Haley
fonte
2

Para adicionar às outras respostas:

Porque o curso SICP (os vídeos estão disponíveis aqui ) é incrível: ensina Lisp e muito mais !

OysterD
fonte
2

Aplicativo assassino? A Franz Inc. possui uma longa lista de casos de sucesso , mas essa lista inclui apenas os usuários do AllegroCL ... Provavelmente existem outros. O meu favorito é a história do Naughty Dog , já que eu era uma grande fã dos jogos Crash Bandicoot.

Para aprender o Common Lisp, eu recomendaria o prático Common Lisp . Ele tem uma abordagem prática que, pelo menos para mim, tornou mais fácil do que outros livros que já vi.

Vetle
fonte
2

Você poderia usar o Clojure hoje para escrever testes e scripts em cima da Java VM. Embora existam outras linguagens Lisp implementadas na JVM, acho que o Clojure faz o melhor trabalho de integração com Java.

Há momentos em que a própria linguagem Java atrapalha a escrita de testes para código Java (incluindo "programação comercial tradicional"). (Não quero dizer isso como uma acusação de Java - outras linguagens sofrem do mesmo problema - mas é um fato. Desde o tópico, não Java, não vou elaborar. Sinta-se à vontade para iniciar um novo tópico, se alguém quer discutir o assunto.) Clojure elimina muitos desses obstáculos.

Bill Smith
fonte
2

O Lisp pode ser usado em qualquer lugar em que você use a programação tradicional. Não é tão diferente, é apenas mais poderoso. Escrevendo um aplicativo da web? você pode fazer isso no Lisp, escrevendo um aplicativo de desktop? você pode fazê-lo no Lisp, o que for, provavelmente pode fazê-lo no Lisp, no Python ou em qualquer outra programação genérica (existem algumas linguagens adequadas para apenas uma tarefa).

O maior obstáculo provavelmente será a aceitação de seu chefe, colegas ou clientes. Isso é algo que você terá que trabalhar com eles. A escolha de uma solução pragmática como o Clojure, que pode alavancar a base de instalação atual da infraestrutura Java, da JVM às bibliotecas, pode ajudá-lo. Além disso, se você tiver um programa Java, poderá fazer uma arquitetura de plug-in e escrever plug-ins Clojure para ele e acabar escrevendo metade do seu código no Clojure.

Pablo
fonte
1

Não é uma razão, mas o AutoCAD (trivial) tem suporte a tempo de execução LISP e DCL. É uma maneira conveniente de escrever macros complexas (incluindo automação ActiveX) se você não quiser usar o VBA ou seus SDKs C ++ ou .NET, ou se uma expressão DIESEL não for suficiente.

Muitas funções do AutoCAD são na verdade rotinas LISP.

Cara de CAD
fonte
1

Este é um tópico que eu próprio ponderei há algum tempo, mas ainda não cheguei a uma decisão, já que o tempo usual é o principal problema ...;)

E como não consigo encontrar esses links facilmente neste post, os adiciono para interesse público:

História de sucesso e fracasso: Lisping na JPL

História de sucesso realmente impressionante: Lisp em uso na empresa Orbitz

Comparação e análise de usar Lisp em vez de Java: Lisp como uma alternativa para Java

PPS
fonte
0

Sintaxe é irrelevante, legibilidade não é!

kokos
fonte
0

Aplicativo assassino? O mecanismo de busca de voos da ITA Software é um deles.

Quanto ao "porquê", provavelmente o tornará um desenvolvedor melhor e é extremamente improvável que o torne um desenvolvedor pior. Pode, no entanto, fazer você preferir dialetos lisp a outros idiomas.

Vatine
fonte