該CPP擴展允許條件編譯,如
{-# LANGUAGE CPP #-}
#ifdef DEBUG
-- some debug code
#endif
當然,它作業得很好,但它非常笨拙且不習慣。真的沒有其他機制可以實作條件編譯嗎?
(我真正想使用它的具體情況是Text.Megaparsec.Debug.dbg函式。它產生的決議跟蹤非常有用,但源代碼中充斥著#ifdef......#endif噪音,這使得它變得相當不可讀。頂部的包裝函式可以消除大部分噪音,但我仍然想知道。)
uj5u.com熱心網友回復:
一個輕量級的解決方案是只使用一次 CPP 來定義一個布林值,然后可以在常規 Haskell 代碼中使用它:
#ifdef DEBUG
#define debug True
#else
#define debug False
#fi
或者一個宏,如果你甚至不希望除錯代碼通過型別檢查。
在沒有 CPP 的情況下進行條件編譯的另一種方法是在包級別更改模塊的源代碼,盡管我不知道這方面的任何實際示例。
創建兩個具有相同名稱debug/Debug.hs和 的模塊nodebug/Debug.hs,例如,都匯出一個 boolean debug :: Bool。
在包配置中,添加一個標志以在debug/和之間進行選擇nodebug/。
flag debug
description: debug mode
default: False
manual: True
library
...
if flag(debug)
hs-source-dirs: debug
else
hs-source-dirs: nodebug
現在您可以構建庫-f debug以啟用除錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387024.html
