Existe-t-il une technique courante pour gérer l'état (en général) dans un langage de programmation fonctionnel? Il existe des solutions dans chaque langage de programmation (fonctionnel) pour gérer l'état global, mais je veux éviter cela autant que possible.
Tous les états d'une manière purement fonctionnelle sont des paramètres de fonction. J'ai donc besoin de mettre tout l'état du jeu (une gigantesque table de hachage avec le monde, les joueurs, les positions, le score, les actifs, les ennemis, ...)) comme paramètre pour toutes les fonctions qui veulent manipuler le monde sur une entrée ou un déclencheur donné . La fonction elle-même sélectionne les informations pertinentes dans le blob gamestate, fait quelque chose avec, manipule le gamestate et renvoie le gamestate. Mais cela ressemble à une mauvaise solution pour le problème. Si je mets le gamestate entier dans toutes les fonctions, il n'y a aucun avantage pour moi contrairement aux variables globales ou à l'approche impérative.
Je pourrais mettre juste les informations pertinentes dans les fonctions et retourner les actions qui seront prises pour l'entrée donnée. Et une seule fonction applique toutes les actions au gamestate. Mais la plupart des fonctions ont besoin de beaucoup d'informations «pertinentes». move()
besoin de la position de l'objet, de la vitesse, de la carte de collision, de la position de tous les ennemis, de la santé actuelle, ... Donc cette approche ne semble pas fonctionner non plus.
Donc, ma question est de savoir comment gérer la quantité massive d'état dans un langage de programmation fonctionnel - en particulier pour le développement de jeux?
EDIT: Il existe des cadres de jeu pour créer des jeux dans Clojure. L'approche pour résoudre partiellement ce problème consiste à enfiler tous les objets du jeu en tant qu '"entités" et à les placer dans un énorme sac. Une fonction principale gigant tient l'écran et les entités et les événements de poignée ( :on-key-down
, :on-init
...) pour ce entités et exécuter la boucle d'affichage principal. Mais ce n'est pas la solution propre que je recherche.
move()
, vous devriez probablement passer dans l'objet `` actuel '' (ou un identifiant pour lui), plus le monde dans lequel il se déplace, et juste dériver la position et la vitesse actuelles ... la sortie est alors le monde physique entier, ou du moins une liste d'objets modifiés.