Je travaille sur mon propre petit langage de programmation à des fins éducatives et j'ai rencontré un petit problème. Il existe plusieurs solutions différentes, mais toutes semblent inélégantes - et d'après ce que je comprends, inutiles. Mais en lisant les livres que j'ai et les recherches Google, je ne trouve pas la solution élégante.
Donc, le problème est que je me fonde sur le calcul lambda de base tel que je le comprends. J'ai défini vrai / faux comme termes d'abstraction. Je peux les combiner avec des fonctions pour faire si / alors / autre sorte de comportement. Le problème vient des boucles. Je peux définir une boucle while de base via la récursivité, mais en pratique, cela provoque un débordement de pile. Si je comprends bien, la solution habituelle serait d'effectuer l'optimisation des appels de queue, mais je ne vois pas comment je peux - les conditions sont définies en langage. Pour cette raison, le compilateur ne sait pas que le corps de la boucle while est en position de queue.
Le livre du dragon se concentre sur la mise en œuvre de la boucle en supposant qu'il existe des étiquettes et des gotos. Je pourrais certainement le faire. Il semble que d'autres langages qui ne construisent pas en boucle construisent au moins des conditionnels, puis effectuent le TCO. Et je pourrais certainement le faire aussi. Mais ma compréhension est que tant que je peux appliquer des abstractions et effectuer des réductions, les boucles (et tout le reste) devraient pouvoir être construites à partir de ces blocs de base.
Alors qu'est-ce qui me manque? Ou est-ce un de ces cas où "vous pouvez modéliser n'importe quoi une fois que vous avez X et Y" n'est pas la même chose que "vous pouvez modéliser n'importe quoi une fois que vous avez X et Y sur un vrai ordinateur" et des intégrés sont nécessaires pour la pratique fins?