O que devo aprender com o Scheme?

10

Fiquei me perguntando quais recursos únicos posso aprender com o Scheme que me ajudariam a me tornar um programador melhor?

Tenho muita experiência em idiomas comuns e pretendo expandir meus horizontes e aprender sobre aspectos funcionais ausentes de outros idiomas. Eu estou familiarizado com fechamentos de javascript, expressões lambda de C # e queria saber o que posso focar em falta em outros idiomas? Além da sintaxe do Lisp, sinto o que vi até agora e já encontrei em outros idiomas.

O que é exclusivo do Scheme / Lisp que me ensinará algo novo?

bunglestink
fonte
3
Vale a pena aprender o Lisp para a profunda experiência de iluminação que você terá quando finalmente obtê-la; essa experiência o tornará um programador melhor pelo resto dos seus dias, mesmo que você nunca use muito o Lisp. - Eric Raymond
Robert Harvey
11
Também: xkcd.com/297
Robert Harvey
11
@Robert Harvery: Também: xkcd.com/224
Poindexter
2
Em sua forma atual, essa questão não é particularmente construtiva. Se você pode refazê-lo para solicitar informações mais específicas, pode ser útil.
ChrisF
Veja também Ensinar idiomas de programação em uma era pós-linnaiana e o livro que este documento faz referência: Linguagens de programação: aplicativo e interpretação , que usa a linguagem de raquete , um dialeto do esquema.
Robert Harvey

Respostas:

7

Talvez a característica definidora mais importante do Lisp seja "Código como Dados".  Você não terá essa experiência da mesma maneira com qualquer outro idioma. Em C #, o analógico mais próximo são as árvores de expressão.

É essa qualidade que faz do Lisp uma excelente linguagem para análise. É também a qualidade que motivou Paul Graham a dizer sobre o Lisp: "O incomum sobre o Lisp - de fato, a qualidade definidora do Lisp - é que ele pode ser escrito por si só". Embora os compiladores de hospedagem automática não sejam novidade, nenhum idioma o faz de maneira tão elegante quanto o Lisp.

A metaprogramação (algo em que o Lisp também se destaca) também é algo que vale a pena aprender.

Batendo as médias por Paul Graham
http://www.paulgraham.com/avg.html

Robert Harvey
fonte
11
Eu acho que a razão pela qual eu nunca tive esse "aha!" O momento em que a ESR me prometeu foi que eu já tinha a revelação "código como dados" no Prolog.
Frank Shearar
11
Haskell tem o atributo "código como dados"? Ou a beleza depende muito da digitação e reflexão dinâmicas?
Joey Adams
11
@ Joey: Eu acho que o fato de o modelo Haskell existir significa que o Haskell não possui o atributo "code as data".
Jrandom_hacker
4

Sim, isso ajudará você a pensar de forma recursiva. Eu o estudei (esquema) apenas por um mês ou mais em uma aula de linguagem de programação e isso me ajudou a evoluir a maneira de pensar e resolver problemas de programação.

É sempre valioso tentar outros paradigmas de programação; você volta atualizado para o mundo OO com novas idéias.

Não é a sintaxe, mas o raciocínio, é um ótimo exercício cerebral. Além da recursão e do uso interessante de listas, não há muito mais IMHO, mas vale a pena.

dukeofgaming
fonte
Não é exclusivo do esquema. Qualquer (ou quase) linguagem funcional é adequada para exercer recursão.
Concordo, mas o OP parece interessado no Esquema comparação com línguas 'mainstream' ....
Xavier Nodet
1

Continuação :

Em ciência da computação e programação, uma continuação é uma representação abstrata do estado de controle de um programa de computador. Uma continuação reifica o estado de controle do programa, ou seja, a continuação é uma estrutura de dados que representa o processo computacional em um determinado ponto na execução do processo; a estrutura de dados criada pode ser acessada pela linguagem de programação, em vez de estar oculta no ambiente de tempo de execução. Ele contém informações como a pilha atual do processo (incluindo todos os dados cuja vida útil está dentro do processo, por exemplo, "variáveis ​​locais"), bem como o ponto do processo na computação. Uma instância de continuação pode ser usada posteriormente como uma estrutura de controle; após a invocação, retomará a execução a partir do ponto de controle que representa. A "continuação atual"

e tente implementar o operador ambíguo de McCarthy :

Em 1963, John McCarthy, o inventor de Lisp, publicou o artigo A Basis for a Theory Matemático da Computação, no qual propôs a função (no sentido da palavra programa de computador) amb (.,.). A idéia é que amb (x, y) seja primeiro igual a x. Porém, se mais tarde no cálculo for constatado que isso leva a algum tipo de contradição, o valor de x é retraído e substituído por y. Este é um negócio muito mais complexo do que pode parecer a princípio. Retrair um valor significa essencialmente retornar o estado inteiro da computação para onde estava quando amb retornou o valor x e, em seguida, diminuiu o valor de y. Isso significa, de alguma forma, congelar e copiar todo o estado quando x foi retornado pela primeira vez. Quando uma contradição é encontrada, todo o estado do programa é descartado e substituído pela versão congelada, que é reativada. Esses estados congelados são conhecidos como continuações. De muitas maneiras, é como uma declaração da GOTO sobre o ácido. Isso pode causar um salto para um ponto arbitrário no seu código. Mas as continuações são mais agradáveis ​​que as GOTOs, porque são mais passíveis de raciocínio lógico.

knivil
fonte
1

Eu posso pensar no seguinte:

  • Macros reais (usando todo o poder da linguagem para gerar código)
  • Homoiconicidade (dados como código, código como dados)
  • Avaliação preguiçosa
  • Continuações

Também acho que as linguagens lisp devem ser incríveis para definir linguagens específicas de domínio (DSL). É algo que você pode querer ler se ainda não o conhece.

Joanis
fonte