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