Stackless Trampolin Monade / Berechnung Ausdruck

9

Ich arbeite an einer funktionalen Programmiersprache meines eigenen Designs und stolperte über ein Problem, das über meine Fähigkeiten hinausgeht. Ich würde gerne wissen, ob jemand einen Rat hat, wie man es lösen kann oder warum es unmöglich ist.

Der folgende Code ist ein Überblick über eine Lösung, die nicht ideal, sondern ein Kompromiss ist.

Dieses Problem ist das Herzstück des Laufzeitsystems, das ich gerade benutze. Anstatt sich auf den .Net-Stack zu verlassen, verwende ich eine Monade, um Operationen auf einem Trampolin auszuführen. Dies sollte beim schrittweisen Debuggen helfen und es den Benutzern ermöglichen, sich nicht um Stapelspeicher kümmern zu müssen. Hier ist eine vereinfachte Version der Monade, die ich gerade benutze.

%Vor%

Dies war nicht der ursprüngliche Entwurf, aber es war das Beste, was ich mit F # -Berechnungsausdrücken in einer idealen Welt erreichen konnte. Der obige Berechnungsausdruck würde bei diesem Typ funktionieren.

%Vor%

Um also einen StackFree in einen Running-Typ zu konvertieren, muss ich diese Konvertierungsfunktion verwenden

%Vor%

Hier ist ein kurzes Beispiel für die zwei Arten in Aktion.

%Vor%

Ich habe mehrere Stunden damit verbracht, einen Berechnungsausdruck zu bekommen, der direkt auf den Running-Typ wirkt und den Zwischenhändler StackFree ausblendet. Allerdings kann ich nicht herausfinden, wie es geht. An dieser Stelle denke ich ernsthaft über die Möglichkeit nach, dass eine Lösung für dieses Problem unmöglich ist. Jedoch kann ich den Grund nicht herausfinden, dass es unmöglich ist.

Ich bin ein paar Mal zu nahe gekommen, aber die daraus resultierenden Lösungen haben den Stack auf eine verwirrende Art benutzt.

Ist es möglich, einen Berechnungsausdruck zu verwenden, der auf dem Running-Typ ausgeführt wird, ohne den .Net-Stack zu verwenden? Wenn das nicht möglich ist, warum ist das nicht möglich? Es muss eine einfache mathematische Argumentation geben, die ich vermisse.

NB: Dies sind nicht die tatsächlichen Typen, die ich verwende. Sie sind für diese Fragen vereinfacht, die echten behalten den Überblick über Umfang und Position im Skript. Außerdem bin ich mir der ernsten Leistungskosten dieser Art von Abstraktion bewusst.

Bearbeiten: Hier ist ein weiterer Weg, um das Problem anzugehen. Diese Implementierung ist fehlerhaft, da sie den Stapel verwendet. Gibt es trotzdem das genaue Verhalten unten ohne den Stack zu benutzen?

%Vor%

Die Bindungsimplementierung im obigen Berechnungsausdruck erstellt eine Funktion, die eine andere Funktion aufruft. Wenn Sie also tiefer gehen und die Bindung immer mehr aufrufen, müssen Sie eine Reihe von Funktionsaufrufen verfolgen und dann treffen Sie schließlich auf eine stackoverflow-Ausnahme.

Bearbeiten2: Klarheit.

    
Thomas Devries 17.07.2017, 19:18
quelle

0 Antworten

Tags und Links