У меня есть проект для Uni по написанию компилятора (на Haskell) для простого выдуманного императивного языка. Одним из требований является печать операторов отладки при входе в вызов функции, выходе из функции и назначении переменных.
Печатать сообщения при входе в функции легко, я просто использую Debug.trace, например:
functionValue = trace "Entering function" (evaluateFunction functionArguments)
Тот же процесс применяется при назначении переменных. Чего я не могу понять, так это того, как печатать при возврате из вызова функции и правильно синхронизировать вывод с другими выходами. Каждая попытка, которую я предпринял до сих пор, приводила к тому, что «Функция выхода» печаталась сразу после «Входа в функцию» - мне нужно, чтобы внутренние операторы отладки функции (назначение и вложенные вызовы функций) были напечатаны до того, как «Функция выхода» будет напечатана.
Мои императивные привычки говорят мне, что мне нужен способ принудительного выполнения (evaluateFunction functionArguments) до вывода функции выхода, но это кажется невозможным и неправильным в Haskell.
Пример вывода, который я получаю сейчас:
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.
Вывод той же программы так, как мне нужно:
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...
Итак, что такое идиома Haskell для «запустить myFunctionWithTraces, затем распечатать myString»?
putStrLn
или подобное. - person dave4420   schedule 15.04.2012