2013-05-19 15 views
9

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?

+1

Czy rozważałeś użycie 'Debug.Trace'? [Haskel Debugging] (http://en.wikibooks.org/wiki/Haskell/Debugging) daje trochę przyzwoitej odrobiny szczegółów. – devnull

+0

@devnull 'trace' nie zrobi tego, co chcę - ale' traceIO' może ... – MathematicalOrchid

Odpowiedz

10

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.

9

Można to zrobić za pomocą preprocesora CPP i #ifdef.

  1. 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 
    
  2. 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 
    
        ... 
    
  3. Wreszcie, aby włączyć debugowanie, włączyć flagę z -f podczas konfigurowania:

    $ cabal configure -f debug 
    
0

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.

Powiązane problemy