2013-05-19 27 views
9

OK, vậy đây là một câu hỏi đơn giản. Tôi đã viết một hàm debug :: String -> IO(). Tôi muốn thiết lập mọi thứ để khi tôi biên dịch chương trình của mình theo một cách, hàm này ghi vào lỗi tiêu chuẩn, và nếu tôi biên dịch chương trình của tôi theo cách khác, hàm này sẽ trở thành no-op. Có một số chuyển đổi dễ dàng biên dịch thời gian để làm điều đó? Hay tôi phải tự mình thực hiện điều gì đó?Trình chuyển đổi trình biên dịch để bật/tắt thông báo gỡ lỗi?

+1

Bạn đã cân nhắc sử dụng 'Debug.Trace' chưa? [Haskel Debugging] (http://en.wikibooks.org/wiki/Haskell/Debugging) cung cấp một số chi tiết khá chi tiết. – devnull

+0

@devnull 'dấu vết' sẽ không làm những gì tôi muốn - nhưng' traceIO' có thể ... – MathematicalOrchid

Trả lời

10

Tôi không nghĩ rằng liên quan đến trace là phương pháp phù hợp để giải quyết vấn đề này.

Thay vào đó, bạn có thể sử dụng bộ tiền xử lý để tắt/bật thông báo gỡ lỗi. Đặt những điều sau đây trong một file riêng biệt:

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

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

Dòng {-# LANGUAGE CPP #-} phép tiền xử lý C cho file hiện hành. Sau đó, bạn có thể biên dịch tệp có/không cần gỡ lỗi bằng cách sử dụng ghc -DDEBUG hoặc chỉ ghc.

9

Bạn có thể thực hiện việc này bằng cách sử dụng bộ tiền xử lý CPP và #ifdef.

  1. Trước tiên, sử dụng #ifdef để chọn giữa hai phiên bản của hàm.

    {-# LANGUAGE CPP #-} 
    module Logging (debug) where 
    
    debug :: String -> IO() 
    #ifdef DEBUG 
    debug = putStrLn 
    #else 
    debug _ = return() 
    #endif 
    
  2. Sau đó, thêm một lá cờ để tập .cabal của bạn để kiểm soát nó.

    ... 
    
    flag debug 
        description: Enable debug logging 
        default:  False 
    
    executable foo -- or library 
        if flag(debug) 
        cpp-options: -DDEBUG 
    
        ... 
    
  3. Cuối cùng, để cho phép gỡ lỗi, bật cờ với -f khi cấu hình:

    $ cabal configure -f debug 
    
0

Để bổ sung cho câu trả lời tuyệt vời đưa ra ở đây, tôi muốn đề cập đến phương pháp này, trong trường hợp những người (như tôi) đang sử dụng phiên bản mới nhất của stack cùng với hpack.

Trong tập tin package.yaml tôi thêm như sau:

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 

Sau đó, tôi sẽ khuyên bạn nên sử dụng traceIO từ Debug.Trace kết hợp với NoTrace, do đó traceIO sẽ không có hiệu lực khi mã được biên dịch mà không có sự debug cờ :

{-# LANGUAGE CPP #-} 

-- ... 

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

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

Khi sử dụng ngăn xếp, cờ debug có thể được bật bằng cách sử dụng --flag tùy chọn:

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

Hoặc nếu bạn đang thử nghiệm gói của bạn:

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

Nếu hpack không được sử dụng, thì bạn có thể cấu hình file cabal của bạn như được giải thích bởi hammar.

Các vấn đề liên quan