Question

Mon professeur nous a dit que nous pourrions choisir un langage de programmation pour notre prochaine tâche de programmation. J'avais l'intention d'essayer un langage fonctionnel, alors j'ai décidé d'essayer le clojure. Le problème est que je comprends la syntaxe et les concepts de base, mais je ne parviens pas à tout faire pour "cliquer". dans ma tête. Est-ce que quelqu'un a un conseil? Ou est-ce que je choisis peut-être le mauvais langage pour commencer une programmation fonctionnelle?

Était-ce utile?

La solution

C’est un peu comme faire du vélo, il faut juste s’entraîner. Essayez de résoudre certains problèmes, par exemple, ProjectEuler et, éventuellement, vous pourrez cliquer.

Quelqu'un a mentionné le livre "The Little Schemer" et c'est une très bonne lecture. Bien que ciblé, les problèmes actuels mériteront d’être résolus.

Bonne chance!

Autres conseils

En ce qui me concerne, j’ai rencontré le même problème que lorsque vous avez commencé à utiliser OCAML, mais le truc, c’est que vous devez commencer à penser à ce que vous voulez du code et < em> not comment le faire !!!

Par exemple, pour calculer le carré des éléments de la liste, oubliez la longueur de la liste et de telles astuces, il suffit de penser mathématiquement comme ça:

  • si la liste est vide - > J'ai fini

  • sinon, la liste doit avoir une tête et une queue - > vous calculez le carré de la tête, puis demandez à votre fonction de faire de même avec la queue.

Pensez simplement au cas général et à celui de base, et que vous émettez des données sans les modifier (sauf si vous souhaitez les modifier;)).

Bonne chance!

Vous pouvez consulter Le petit Schemer .

Que diriez-vous de cela: http://www.defmacro.org/ramblings/lisp.html

C’est une introduction très simple, étape par étape, à la pensée globale du point de vue d’un programmeur basé sur des impératifs réguliers (Java, C #, etc.).

À des fins éducatives, je recommanderais le système PLT. C'est un environnement portable et puissant avec de très bons exemples et une documentation encore meilleure. Cela vous aidera à découvrir les idées qui sous-tendent la programmation fonctionnelle, étape par étape et de manière très propre. Choisir une petite application à implémenter vous aidera à apprendre le nouveau langage.

http://www.plt-scheme.org/

En outre, "Structure et interprétation des programmes informatiques". de H. Abelssn, G. Sussman et J. Sussman est un très bon livre sur Scheme (et la programmation).

Cordialement

mue

Jetez un coup d’œil à 99 problèmes de Lispy

Quelques réflexions sur Lisps, qui ne sont pas spécifiques à Clojure (je ne suis pas un expert en Lisp, j'espère donc qu'elles sont généralement correctes et utiles):

Codage en AST

Je connais peu la théorie du compilateur ou de l'interpréteur, mais chaque fois que je code avec Lisp, je suis étonné de la possibilité de créer directement un AST.

Cela fait partie de ce que " code = data " En clair, coder en Lisp revient à remplir des structures de données (listes imbriquées) avec des nœuds AST. Incroyable, et facile à lire aussi (avec le bon éditeur de texte).

Un langage de programmation programmable

Ainsi, les fragments de code ne sont que des listes imbriquées et les opérations de liste font partie du langage. Vous pouvez donc très facilement écrire du code Lisp qui génère du code Lisp (voir Macros Lisp). Cela fait de Lisp un langage de programmation programmable (en soi!).

Cela facilite la construction d'un DSL ou d'un interprète en lisp (voir évaluation méta-circulaire ).

Ne jamais redémarrer quoi que ce soit

Et dans la plupart des systèmes Lisp, le code (y compris la documentation) peut être inspecté et remplacé à chaud au moment de l'exécution.

POO avancée

Ensuite, la plupart des systèmes Lisp ont une sorte de système d'objet dérivé de CLOS, qui est un système d'objet avancé (comparé à de nombreuses implémentations OOP) et configurable (voir L'art du protocole de métaobjet ).

Toutes ces fonctionnalités ont été inventées il y a longtemps, mais je ne suis pas sûr qu'elles soient disponibles dans de nombreux autres langages de programmation (bien que la plupart soient en train de rattraper, par exemple des fermetures), vous devez donc "redécouvrir". et s'y habituer en pratiquant (voir les livres dans d'autres réponses).

Rappelez-vous: ce sont toutes des données!

Ecrivez quelques fonctions classiques simples pour lesquelles Lisp est doué, comme

  • inverser une liste

  • dire si un atome est quelque part dans une expression s

  • écrivez EQUAL pour indiquer si 2 expressions s sont égales

  • écrivez FRINGE pour obtenir la liste des atomes à la frange d'une expression s

  • écrivez SUBST, puis écrivez SUBLIS

  • Différenciation symbolique

  • Simplification algébrique

  • écrivez une simple EVAL et / ou APPLY

Comprenez que Lisp est bon pour ce type de programmes fonctionnels sans effet secondaire.

Il est également utile pour les programmes à effets secondaires avec état (non fonctionnels), mais ceux-ci ressemblent davantage à des "programmes". que "fonctions".

Ce qui est meilleur pour une application donnée dépend de l’application. En général, il ne doit contenir ni plus ni moins que nécessaire les informations d’état.

Facile!

  

M-x & nbsp; lisp-mode

D'accord, d'accord, vous n'aurez peut-être pas Emacs pour cerveau. Sérieusement, ce que vous devez faire est d’être vraiment bon en récursivité. Cela peut être un véritable casse-tête lorsque vous essayez d'étendre le concept de récursivité au-delà des exemples canoniques, mais cela aboutira finalement à un code plus fluide et plus fluide.

De plus, beaucoup de gens sont accrochés à la parenthèse, et je ne sais pas vraiment pourquoi - la syntaxe est très simple et cohérente et peut être maîtrisée en quelques minutes. En ce qui me concerne, je suis arrivé chez Scheme après avoir appris le C ++ et Java, et j’ai toujours pensé que la différence entre "fonctions" et et " opérateurs " était une fausse dichotomie, et il était rafraîchissant de voir cette distinction éliminée.

En ce qui concerne la programmation fonctionnelle, tant que vous pouvez comprendre le fait qu’une fonction est une valeur de premier ordre et qu’elle peut être transmise à la fois par d’autres fonctions, tout devrait bien se passer. L’utilité de cela deviendra évidente avec le temps, mais il suffit que vous puissiez écrire des fonctions de prise de fonction et de retour de fonction.

Enfin, je ne suis pas sûr du support fourni par Clojure pour les macros, mais ils sont considérés comme une partie essentielle de lisp. Cependant, je ne m'inquiéterai pas de les apprendre tant que vous ne serez pas familiarisé avec les éléments ci-dessus - bien que les macros soient incroyablement utiles et polyvalentes, elles sont également utilisées moins souvent que les autres techniques que j'ai mentionnées.

Je commencerais par un langage qui peut être interprété. J'ai trouvé Moscou ML assez simple. C’est une implémentation légère de la norme ML.

Ma pratique personnelle est de trouver un petit projet (quelque chose qui risque de prendre 3 à 5 nuits) et de le mettre en œuvre. Que diriez-vous d'un outil de filtrage de blog? Peut-être juste une implémentation de tours de Hanoi ou de liste chaînée (ce sont généralement des projets d’une nuit).

La façon dont cela fonctionne habituellement est que je l’implémente mal la première fois, jette ce que j’avais et j’ai fini par y entrer quelques heures.

Une aide énorme est de suivre un cours dans quelque chose comme ... euh ... LISP! :) Les devoirs vont vous obliger à confronter un grand nombre de concepts et ils ont été cliqués bien avant la fin du semestre.

Bonne chance !!

Bonne chance. Il m'a fallu attendre jusqu'à mi-chemin de la section "Langages de programmation". cours au collège avant Scheme "cliqué". Une fois que cela est arrivé, cependant, tout est devenu logique et je suis tombé amoureux de la programmation fonctionnelle.

Écrivez un interpréteur Lisp dans Lisp.

Si vous n’êtes pas encore au courant, découvrez ce qui fait de lisp une langue unique. Si vous ne le faites pas d'abord, vous essayerez de faire la même chose que dans d'autres langages de programmation.

Ensuite, essayez de mettre en œuvre une petite chose (essayez de la rendre utile ou vous pourriez ne pas avoir la motivation).

Lisp dans une boîte est un excellent moyen de se mouiller les pieds.

Pour moi, l’important est de vous assurer de tout faire de façon irréfléchie. Ne soyez pas tenté de penser "En Java, j'utiliserais une boucle for ici, comment puis-je faire pour les boucles en Lisp?" mais pour parcourir suffisamment d'exemples et de tutoriels (comme quelqu'un l'a souligné, SICP est parfait pour cela) que vous pouvez commencer à repérer quand le code a l’air "Lisp-y" et reconnaître les paradigmes de langage commun.

Je connais certainement le sentiment de regarder du code que je viens d'écrire et de savoir intuitivement qu'il est parfaitement idiomatique pour ce langage et cette plate-forme / ce cadre - c'est, je pense, le moment où il "clique".

Modifier : et bravo pour avoir choisi un langage fonctionnel, les étudiants moins expérimentés l'auraient fait en Java:)

Qui a dit qu'il allait cliquer? Je suis toujours confus

Mais si vous pensez à combien d’abstractions il est possible de se cacher, derrière des macros lisp. Ensuite, votre cerveau va exploser.

:

Je vérifierais la programmation de Clojure. C'est un excellent livre pour les non-lispers.

En plus de ce que d’autres SO ont déjà suggéré, voici mes 2 centimes:

  1. Commencez à apprendre la langue et essayez quelques problèmes numériques / passe-temps simples dans la langue
  2. IMPORTANT: envoyez la solution / le code à StackOverflow, en demandant l'avis des internautes si tel est vraiment le moyen utilisé par LISPy .

Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top