2013-05-14 65 views
5

我有一個literate haskell文件,並且想要使用條件編譯。我使用文學編程的鳥類風格。以下代碼不起作用。Literate Haskell中的條件編譯

> #if MIN_VERSION_base(4,6,0) 
> import Control.Exception 
> #endif 

我需要爲小集團的解決方案1.14.0

編輯:

cpphs有一個選項--unlit這unlits有文化的源代碼,但我不知道怎麼打發這個在cabal中選擇cpphs。

回答

4

@kosmikus指出,只要將C預處理器指令放在任何>\begin{code}之外,並且它們將按預期工作 - 如果它們不妨礙處理字面代碼的非代碼部分。

您只是不能將C預處理器指令與鳥式文字編程一起使用,因爲unlitting步驟會用空格替換>,所以您沒有機會將#放入第一列。您可以通過將-keep-tmp-files傳遞給GHC並檢出生成的.lpp文件來驗證此情況。

您可以訴諸\begin{code} ... \end{code}塊兩全,但是如果他們的代碼>風格的線條將它們混合,保持額外的空間考慮,並將其添加到您的線條包裹在\begin{code} ... \end{code}

> {-# LANGUAGE CPP #-} 

A literal comment 

\begin{code} 
#if MIN_VERSION_base(4,6,0) 
    import Control.Exception 
#endif 
\end{code} 

> main = return() 
+0

您是否真的必須切換到代碼塊?你不能將CPP指令直接放在源文件中,沒有任何前面的'>'? – kosmikus 2013-05-14 14:20:38

+0

Ups,我以爲我先試過,但事實確實如此。 – 2013-05-14 14:33:58