Ich habe ein Projekt für Uni, um einen Compiler (in Haskell) für eine einfache erfundene imperative Sprache zu schreiben. Eine der Anforderungen besteht darin, Debug-Anweisungen beim Eingeben eines Funktionsaufrufs zu drucken, eine Funktion zu verlassen und Variablen zuzuweisen.Haskell - Drucken einer Ablaufverfolgung nach der Ausführung
Nachrichten Drucken, wenn Funktionen Eingabe einfach ist, benutze ich nur Debug.trace, zB:
functionValue = trace "Entering function" (evaluateFunction functionArguments)
Das gleiche Verfahren gilt, wenn auf Variablen zugewiesen wird. Was ich nicht herausfinden kann, ist, wie man druckt, wenn man von einem Funktionsaufruf zurückkehrt und den Ausgang korrekt mit den anderen Ausgaben synchronisiert hat. Jeder Versuch, den ich bisher gemacht habe, hat dazu geführt, dass "Leaving function" unmittelbar nach "Entering function" gedruckt wurde - ich brauche die internen Debug-Anweisungen der Funktion (Zuweisungen und verschachtelte Funktionsaufrufe), bevor "Leaving function" gedruckt wird.
Meine Imperativgewohnheiten sagen mir, dass ich eine Möglichkeit brauche, die Ausführung von (evaluateFunction functionArguments) vor der leave-function-Ausgabe zu erzwingen, aber das scheint in Haskell unmöglich und falsch zu sein.
Beispiel Ausgabe erhalte ich jetzt:
Entering main function...
Leaving main function...
Entering fn1 function...
Leaving fn1 function...
Assigning value1 to A.
Assigning value2 to C.
Entering fn2 function...
Leaving fn2 function...
Assigning value3 to B.
Assigning value4 to C.
gleiche Programmausgabe so, wie ich es muss aussehen:
Entering main function...
Entering fn1 function...
Assigning value1 to A.
Leaving fn1 function...
Assigning value2 to C.
Entering fn2 function...
Assigning value3 to B.
Assigning value4 to C.
Leaving fn2 function...
Leaving main function...
Also, was ist Haskell Idiom für 'laufen myFunctionWithTraces dann drucken myString'?
Da Sie sicherstellen müssen, dass Nachrichten in einer bestimmten Reihenfolge gedruckt werden, sollten Sie Debug.Trace nicht verwenden. Biss stattdessen die Kugel, renne in IO und benutze 'putStrLn' oder ähnliches. – dave4420
Kompilieren Sie nach Haskell? –