Drucken eines AST mit Variablennamen

8

Ich versuche, in Haskell ein EDSL zu implementieren. Ich würde gerne den AST mit den Variablennamen drucken, die gebunden sind (wenn ich die echten Namen nicht bekommen kann, dann würden einige generierte Namen genügen).

So weit habe ich ein einfaches Beispiel:

%Vor%

Dies führt zu:

%Vor%

Ich möchte also Plus (I 4) (I 3) durch Plus var0 var1 ersetzen. Ich habe darüber nachgedacht, durch den Rest des Baums zu gehen und die gebundenen Variablen durch Namen-Wert-Tupel zu ersetzen, aber ich bin mir nicht 100% sicher, ob / wie das funktionieren würde. Ich würde es auch vorziehen, die ursprünglichen Variablennamen zu behalten, aber ich kann mir keine einfache Möglichkeit vorstellen, dies zu tun. Ich hätte lieber eine ziemlich leichte Syntax in Haskell (so wie oben).

Ich würde auch Hinweise auf Materialien schätzen, die mich lehren, wie man diese Dinge am besten macht. Ich habe ein bisschen über freie Monaden und GADTs gelesen, aber ich denke, ich vermisse es, alles zusammen zu setzen.

    
Paul 15.02.2013, 21:59
quelle

2 Antworten

5

Mit der Struktur, die Sie haben, können Sie das nicht in "reinem" Haskell-Code tun, denn wenn Ihr Code einmal kompiliert wurde, können Sie nicht (Plus a b) von (Plus (I 4) (I 3)) unterscheiden und "referentielle Transparenz" - die Austauschbarkeit behalten von Variablen und ihren Werten.

Allerdings gibt es unsichere Hacks - d. h., die nicht garantiert funktionieren -, die Sie dazu bringen können, so etwas zu tun. Sie gehen im Allgemeinen unter dem Namen "beobachtbares Teilen" und basieren darauf, Zugang zu den Interna der Darstellung von Werten zu erhalten, indem sie StatusName . Im Wesentlichen erhalten Sie eine Zeigergleichheitsoperation, mit der Sie zwischen dem Verweis auf a und einer neuen Kopie des Werts (I 4) unterscheiden können.

Ein Paket, das diese Funktionalität vervollständigt, ist data-retify .

Die tatsächlichen Variablennamen, die in Ihrer Quelle verwendet werden, gehen während der Kompilierung unwiederbringlich verloren. In Paradise verwenden wir einen Präprozessor, um foo <~ bar vor der Kompilierung in foo <- withName "foo" $ bar zu übersetzen, aber es ist hacky und es verlangsamt sich ziemlich viel.

    
Ganesh Sittampalam 16.02.2013, 00:30
quelle
4

Ich habe das anhand der verknüpften Antwort von @Gabriel Gonzales herausgefunden. Die Grundidee besteht darin, einen neuen Variablen -Konstruktor im Expr-Typ einzuführen, und Sie weisen diesen eine eindeutige ID zu, wenn Sie den Baum interpretieren. Das und Aufräumen des Codes ein bisschen gibt:

%Vor%

Schön drucken und laufen:

%Vor%     
Paul 17.02.2013 14:23
quelle

Tags und Links