2013-05-19 12 views
9

Tamam, işte basit bir soru. Bir fonksiyon yazdım debug :: String -> IO(). Programımı bir şekilde derlediğimde, bu fonksiyon standart hataya yazıyor ve eğer programımı başka bir şekilde derlersek, bu fonksiyon no-op olur. Bunu yapmak için kolay bir derleme zamanı anahtarı var mı? Yoksa kendim bir şey mi uygulamak zorundayım?Derleyici, hata ayıklama iletilerini açmak/kapatmak için geçiş yapar mı?

+1

'Debug.Trace' kullanmayı düşündünüz mü? [Haskel Debugging] (http://en.wikibooks.org/wiki/Haskell/Debugging) bazı detaylar veriyor. – devnull

+0

@devnull 'iz 'istediğimi yapmayacak - ama' traceIO 'olabilir ... – MathematicalOrchid

cevap

10

Bu sorunu çözmek için trace'un doğru yaklaşım olduğunu düşünmüyorum. Hata ayıklama iletilerini devre dışı bırakmak/etkinleştirmek için bir önişlemci kullanabilirsiniz. Üste | ayrı bir dosyada aşağıdakileri koyun:

{-# LANGUAGE CPP #-} 
import System.IO 

debug :: String -> IO() 
debug message = 
#ifdef DEBUG 
    hPutStrLn stderr message 
#else 
    return() 
#endif 

{-# LANGUAGE CPP #-} çizgi geçerli dosya için C önişlemci sağlar. Daha sonra dosyayı ghc -DDEBUG veya sadece ghc kullanarak hata ayıklama olmadan/derleyemezsiniz.

9

Bunu CPP önişlemcisini ve #ifdef kullanarak yapabilirsiniz.

  1. Öncelikle fonksiyonun iki sürümü arasında seçim yapmak #ifdef kullanın.

    {-# LANGUAGE CPP #-} 
    module Logging (debug) where 
    
    debug :: String -> IO() 
    #ifdef DEBUG 
    debug = putStrLn 
    #else 
    debug _ = return() 
    #endif 
    
  2. Sonra de kontrol etmek için .cabal dosyasına bir bayrak ekleyin. yapılandırırken

    ... 
    
    flag debug 
        description: Enable debug logging 
        default:  False 
    
    executable foo -- or library 
        if flag(debug) 
        cpp-options: -DDEBUG 
    
        ... 
    
  3. Son olarak, hata ayıklamayı etkinleştirmek için, -f işaretleyin etkinleştirmek:

    $ cabal configure -f debug 
    
0

burada verilen mükemmel cevapları tamamlamak için, ben durumda, bu yaklaşımı söz istiyorum insanlar (benim gibi), 'un en son sürümünü hpack ile birlikte kullanıyorlar. package.yaml dosyasında

aşağıdaki eklendi:

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 

Sonra kod debug bayrağı olmadan derlenmiş zaman traceIO hiçbir etkisi olmayacaktır böylece NoTrace birlikte Debug.Trace den traceIO kullanmak öneriyoruz : yığın kullanırken

{-# LANGUAGE CPP #-} 

-- ... 

#ifdef DEBUG 
import Debug.Trace 
#else 
import Debug.NoTrace 
#endif    

-- ... 
someFunc :: IO() 
someFunc = do 
    -- ... 
    traceIO "Whatever..." 

, debug bayrağıkullanılarak etkinleştirilebilirseçeneği:

stack build --flag "your-package:debug" 

Ya da paket test ediyorsanız: hammar tarafından açıklandığı gibi

stack build --flag "your-package:debug" 

hpack kullanılmazsa, o zaman Cabal dosyasını yapılandırabilirsiniz.

İlgili konular