schwebender Durchlauf von völlig faulem Lambda-Heben?

9

Ich lese funktionale Sprachen implementieren: ein Tutorial , und stieß auf ein Problem, wenn Floating-Pass von vollständig faulem Lambda-Hub implementiert wurde.

Ich möchte beschreiben, wie das Floating funktioniert, um diese Frage klar zu machen, wenn Sie damit vertraut sind, springen Sie einfach zur nächsten Frage .

Das Konzept wird auf Seite 246 in der Arbeit vorgestellt und hauptsächlich auf Seite 256-257 implementiert.

Im Falle von let(rec) Ausdruck heißt es:

  

Wir müssen floated Definitionen der rechten Seite vor den let(rec) Ausdruck selbst setzen, da die rechte Seite von ihnen abhängen kann.

zum Beispiel:

%Vor%

Die Variable $mfe ist ein maximaler freier Ausdruck (MFE) , die durch vorherigen Durchlauf identifiziert wurde, wenn wir mit let f Ausdruck arbeiten, floaten wir f out als eine Gruppe und hängen sie an [(1, [($mfe, a * a)])] , die von der rechten Seite von let f erhalten wurde. Hier zeigt die erste Komponente 1 die freie Ebene der Gruppe an.

Beim Zurückverfolgen zu \a -> f Abstraktion haben wir festgestellt, dass sowohl $mfe als auch f damit verbunden sind. Daher sollten wir sie hier installieren:

%Vor%

Die Frage

Angenommen, wir haben ein Programm wie dieses:

%Vor%

Die freie Stufe von b x und a y ist 2, da y Stufe 2 hat und sich in derselben Gruppe befindet.

Während freies Level von cons p (b x) und cons q (a y) 3 ist, werden b x und a y als MFEs markiert (Habe ich hier Fehler gemacht?).

Unter Verwendung des von SPJ gegebenen Algorithmus wird das Programm in folgendes umgewandelt:

%Vor%

Ich denke, die MFEs auf der rechten Seite von let(rec) expression sollten nicht den let(rec) -Bereich verlassen, wenn immer auf die linke Seite verwiesen wird, und das korrekte Ergebnis könnte so aussehen :

%Vor%

Ist das Papier falsch? oder ich habe es einfach missverstanden.

    
見崎鳴 05.01.2016, 11:44
quelle

0 Antworten