Ich arbeite an meiner eigenen kleinen Programmiersprache für Bildungszwecke und bin auf ein kleines Problem gestoßen. Es gibt ein paar verschiedene Lösungen dafür, aber alle scheinen unelegant - und nach meinem Verständnis unnötig. Aber wenn ich die Bücher, die ich habe, und die Google-Suche durchlese, kann ich die elegante Lösung nicht finden.
Das Problem ist also, dass ich die grundlegende Lambda-Rechnung so aufbaue, wie ich sie verstehe. Ich habe wahr / falsch als Abstraktionsbegriffe definiert. Ich kann diese mit Funktionen kombinieren, um zu tun, ob / dann / sonst Verhalten. Das Problem kommt mit Schleifen. Ich kann eine grundlegende while-Schleife durch Rekursion definieren, aber in der Praxis führt dies zu einem Stapelüberlauf. Nach meinem Verständnis besteht die übliche Lösung darin, die Tail Call-Optimierung durchzuführen, aber ich sehe nicht, wie ich das kann - Bedingungen werden in der Sprache definiert. Aus diesem Grund weiß der Compiler nicht , dass sich der Körper der while-Schleife in der Endposition befindet.
Das Drachenbuch konzentriert sich auf die Implementierung der Schleife, vorausgesetzt, es gibt Labels und Gotos. Das könnte ich sicher tun. Es sieht so aus, als ob andere Sprachen, die keine Schleifenkonstrukte enthalten, zumindest Bedingungen einbauen und dann TCO ausführen. Und das könnte ich natürlich auch. Mein Verständnis ist jedoch, dass, solange ich Abstraktionen anwenden und Reduktionen durchführen kann, Schleifen (und alles andere) aus diesen Grundblöcken erstellt werden können sollten.
Also, was vermisse ich? Oder ist dies einer der Fälle, in denen "Sie können alles modellieren, wenn Sie X und Y haben" nicht dasselbe ist wie "Sie können alles modellieren, wenn Sie X und Y auf einem echten Computer haben" und integrierte Funktionen für die Praxis erforderlich sind Zwecke?