Que dois-je apprendre de Scheme?

10

Je me demandais quelles fonctionnalités uniques je peux apprendre de Scheme qui pourraient m'aider à devenir un meilleur programmeur?

J'ai beaucoup d'expérience dans les langues traditionnelles et je cherche à élargir mes horizons et à en apprendre davantage sur les aspects fonctionnels qui manquent dans d'autres langues. Je connais les fermetures de javascript, les expressions lambda de C #, et je me demandais ce que je peux me concentrer sur ce qui manque dans d'autres langues? Mis à part la syntaxe Lisp, je me sens comme ce que j'ai vu jusqu'à présent que j'ai déjà rencontré dans d'autres langues.

Qu'est-ce qui est unique à Scheme / Lisp et qui m'apprendra quelque chose de nouveau?

Bunglestink
la source
3
Lisp vaut la peine d'être appris pour l'expérience d'illumination profonde que vous vivrez lorsque vous l'obtiendrez enfin; cette expérience fera de vous un meilleur programmeur pour le reste de vos jours, même si vous n'utilisez jamais vraiment Lisp lui-même. - Eric Raymond
Robert Harvey
1
Aussi: xkcd.com/297
Robert Harvey
1
@Robert Harvery: Aussi: xkcd.com/224
Poindexter
2
Dans sa forme actuelle, cette question n'est pas particulièrement constructive. Si vous pouvez le retravailler pour demander des informations plus spécifiques, cela pourrait être utile.
ChrisF
Voir aussi Enseigner les langages de programmation à l'ère post-linnéenne et le manuel auquel ce document fait référence: Langages de programmation: application et interprétation , qui utilise le langage des raquettes , un dialecte du schéma.
Robert Harvey

Réponses:

7

Peut-être la caractéristique la plus importante de définition de Lisp est "Code as Data."  Vous n'obtiendrez pas cette expérience de la même manière avec une autre langue. En C #, l'analogue le plus proche est les arbres d'expression.

C'est cette qualité qui fait de Lisp un excellent langage d'analyse. C'est aussi la qualité qui a poussé Paul Graham à dire à propos de Lisp: "Ce qui est inhabituel à propos de Lisp - en fait, la qualité qui définit Lisp - c'est qu'il peut être écrit en lui-même." Bien que les compilateurs auto-hébergés ne soient pas nouveaux, aucun langage ne le fait aussi élégamment que Lisp.

La métaprogrammation (quelque chose dans laquelle Lisp excelle également) est également une chose intéressante à apprendre.

Battre les moyennes par Paul Graham
http://www.paulgraham.com/avg.html

Robert Harvey
la source
1
Je pense que la raison pour laquelle je n'ai jamais eu ce "aha!" moment où ESR m'a promis était que j'avais déjà la révélation "code as data" dans Prolog.
Frank Shearar
1
Haskell a-t-il l'attribut «code as data»? Ou la beauté dépend-elle fortement du typage dynamique et de la réflexion?
Joey Adams
1
@Joey: Je pense que le fait que Template Haskell existe signifie que Haskell n'a pas l'attribut "code as data".
j_random_hacker
4

Oui, cela vous aidera à penser de manière récursive. Je l'ai étudié (schéma) pendant environ un mois dans un cours de langage de programmation et cela m'a aidé à faire évoluer ma façon de penser et à résoudre des problèmes de programmation.

Il est toujours utile d'essayer d'autres paradigmes de programmation; vous revenez ensuite rafraîchi dans le monde OO avec de nouvelles idées.

Pas la syntaxe, mais le raisonnement, c'est un excellent exercice cérébral. Hormis la récursivité et l'utilisation intéressante des listes, il n'y a pas grand-chose d'autre à mon humble avis, mais cela en vaut la peine.

dukeofgaming
la source
Pas unique au schéma. N'importe quel (ou presque) langage fonctionnel convient à l'exercice de la récursivité.
Je suis d'accord, mais l'OP semble intéressé par Scheme par rapport aux langues «mainstream» ....
Xavier Nodet
1

Suite :

En informatique et en programmation, une continuation est une représentation abstraite de l'état de contrôle d'un programme informatique. Une continuation réifie l'état de contrôle du programme, c'est-à-dire que la continuation est une structure de données qui représente le processus de calcul à un moment donné de l'exécution du processus; la structure de données créée est accessible par le langage de programmation, au lieu d'être cachée dans l'environnement d'exécution. Il contient des informations telles que la pile actuelle du processus (y compris toutes les données dont la durée de vie se situe dans le processus, par exemple "variables locales"), ainsi que le point du processus dans le calcul. Une instance de continuation peut être utilisée ultérieurement comme structure de contrôle; à l'invocation, il reprendra l'exécution à partir du point de contrôle qu'il représente. La "suite actuelle"

puis essayez d'implémenter l'opérateur ambigu de McCarthy :

En 1963, John McCarthy, l'inventeur de Lisp, a publié le document A Basis for a Mathematical Theory of Computation dans lequel il proposait la fonction (au sens du programme informatique du terme) amb (.,.). L'idée est que amb (x, y) est d'abord égal à x. Mais si plus tard dans le calcul, on constate que cela conduit à une sorte de contradiction, la valeur de x est rétractée et remplacée par y. Il s'agit d'une entreprise beaucoup plus complexe qu'il n'y paraît au premier abord. Rétracter une valeur signifie essentiellement ramener l'ensemble de l'état du calcul à l'endroit où il se trouvait lorsque amb a renvoyé la valeur x, puis glisser la valeur de y. Cela signifie en quelque sorte geler et copier l'état entier lorsque x a été renvoyé pour la première fois. Lorsqu'une contradiction est trouvée, tout l'état du programme est rejeté et remplacé par la version figée qui est réactivée. Ces états gelés sont appelés continuations. À bien des égards, c'est comme une déclaration GOTO sur l'acide. Cela peut provoquer un saut à un endroit arbitraire de votre code. Mais les continuations sont plus agréables que GOTO car elles se prêtent mieux au raisonnement logique.

couteau
la source
1

Je peux penser à ce qui suit:

  • De vraies macros (utilisant toute la puissance du langage pour générer du code)
  • Homoiconicité (données sous forme de code, code sous forme de données)
  • Évaluation paresseuse
  • Continuations

Je pense également que les langues lisp devraient être géniales pour définir des langues spécifiques au domaine (DSL). C'est quelque chose que vous voudrez peut-être lire si vous ne le savez pas déjà.

Joanis
la source