OK, więc tutaj jest proste pytanie. Napisałem funkcję debug :: String -> IO()
. Chciałbym ustawić rzeczy tak, że kiedy skompiluję mój program w jedną stronę, ta funkcja zapisuje do standardowego błędu, a jeśli skompiluję mój program w inny sposób, ta funkcja staje się nieoparta. Czy jest jakiś prosty przełącznik do kompilacji? A może sam będę musiał coś wdrożyć?Przełącznik kompilatora do włączania/wyłączania komunikatów debugowania?
Odpowiedz
Nie sądzę, że z włączeniem trace
jest właściwe podejście do rozwiązania tego problemu.
Zamiast tego można użyć preprocesora do wyłączania/włączania komunikatów diagnostycznych. Umieść następujący w oddzielnym pliku:
{-# LANGUAGE CPP #-}
import System.IO
debug :: String -> IO()
debug message =
#ifdef DEBUG
hPutStrLn stderr message
#else
return()
#endif
Linia {-# LANGUAGE CPP #-}
umożliwia preprocesora C dla bieżącego pliku. Następnie można skompilować plik z/bez debugowania za pomocą ghc -DDEBUG
lub po prostu ghc
.
Można to zrobić za pomocą preprocesora CPP i #ifdef
.
Najpierw użyj
#ifdef
, aby wybrać jedną z dwóch wersji funkcji.{-# LANGUAGE CPP #-} module Logging (debug) where debug :: String -> IO() #ifdef DEBUG debug = putStrLn #else debug _ = return() #endif
Następnie dodać flagę do pliku
.cabal
ją kontrolować.... flag debug description: Enable debug logging default: False executable foo -- or library if flag(debug) cpp-options: -DDEBUG ...
Wreszcie, aby włączyć debugowanie, włączyć flagę z
-f
podczas konfigurowania:$ cabal configure -f debug
celu uzupełnienia doskonałe odpowiedzi udzielone tutaj, chciałbym wspomnieć to podejście, w przypadku ludzie (jak ja) używają najnowszej wersji stack
wraz z hpack
.
W pliku package.yaml
dodałem następujące:
flags:
debug: # Or whatever name you want to give to the flag
description: Enable debug
manual: True
default: False
when:
- condition: flag(debug)
cpp-options: -DDEBUG
to polecam użyć traceIO
z Debug.Trace
w połączeniu z NoTrace
, tak że traceIO
będą miały żadnego wpływu, gdy kod jest kompilowany bez flagi debug
:
{-# LANGUAGE CPP #-}
-- ...
#ifdef DEBUG
import Debug.Trace
#else
import Debug.NoTrace
#endif
-- ...
someFunc :: IO()
someFunc = do
-- ...
traceIO "Whatever..."
Podczas korzystania stos, flaga debug
można włączyć za pomocą --flag
opcja:
stack build --flag "your-package:debug"
Lub jeśli testujesz swój pakiet:
stack build --flag "your-package:debug"
Jeśli hpack
nie jest używany, można skonfigurować plik Cabal jak wyjaśnił hammar.
- 1. Program Logcat nie wyświetla komunikatów poziomu debugowania
- 2. Zapisywanie komunikatów konsoli do debugowania w pliku nightwatch.js
- 3. Buforowanie komunikatów debugowania log4net, aby wyświetlić je w przypadku błędu?
- 4. Unikaj komunikatów debugowania konfiguracji log4j2, aby pojawić się
- 5. Instalowanie bibliotek debugowania MS do zdalnego debugowania
- 6. Konfigurowanie IntelliJ do używania kompilatora Groovy Zamiast kompilatora Java
- 7. Skonfiguruj kompilator komunikatów (mc.exe) jako niestandardowy krok kompilatora w VC++ 2010?
- 8. Przełącznik R skrypt z nieinteraktywny do interaktywnej
- 9. przypadek Przełącznik do dwóch zmiennych INT
- 10. Czy jest jakiś przełącznik do cichej deinstalacji?
- 11. Android: przełącznik do innego IME programowo
- 12. Przełącznik case case w skrypcie do kawy
- 13. Przejście do wtyczki kompilatora Scala
- 14. Wybór odpowiedniego asemblera do kompilatora
- 15. dobry python do kompilatora exe?
- 16. Czego potrzebuję do debugowania pthreadów?
- 17. Czy istnieje sposób w języku komunikatów, aby zdefiniować wiadomośćTrueTree bez rekursji lub sztuczek kompilatora?
- 18. MATLAB: odniesienie do komunikatów o błędach
- 19. Noop do wyczerpujących komunikatów Switch Swift
- 20. Wysyłanie komunikatów do procesora hosta WCF
- 21. C# przełącznik/przerwa
- 22. Przełącznik/case statement
- 23. Bootstrap etykietka danych przełącznik
- 24. Przełącznik bez przerwy
- 25. Przełącznik podrzędny na głębokość
- 26. Jak włączyć tłumaczenie komunikatów o błędach sprawdzania poprawności komunikatów Symfony2?
- 27. Wyrażenia Lambda: zachowanie kompilatora
- 28. przełącznik Go vs if-else sprawność
- 29. Dlaczego program DebugView nie wyświetla komunikatów debugowania, gdy program Visual Studio wykonuje
- 30. Przełącznik niezainicjowany zmienna
Czy rozważałeś użycie 'Debug.Trace'? [Haskel Debugging] (http://en.wikibooks.org/wiki/Haskell/Debugging) daje trochę przyzwoitej odrobiny szczegółów. – devnull
@devnull 'trace' nie zrobi tego, co chcę - ale' traceIO' może ... – MathematicalOrchid