2014-10-22 18 views
6

Ho bisogno di fare alcuni piccoli blocchi del mio programma si comportano in modo diverso su piattaforme diverse. Sembra che GHC non sia molto bravo nella compilazione incrociata, quindi ho intenzione di compilare lo stesso codice su Linux e Windows.Sviluppo multipiattaforma in Haskell

Qual è il modo consigliato per eseguire questa operazione? Devo scrivere molte versioni di un modulo, o ci sono qualcosa come le direttive del preprocessore che posso inserire nel mio codice per compilare condizionatamente un blocco di codice o un altro?

P.S. Sto usando GHC e Cabal per la gestione.

risposta

6

GHC supporta running your code through a C preprocessor. Non è una soluzione molto Haskelly, ma è ciò che viene utilizzato in pratica quando necessario.

EDIT: Zeta ha sottolineato c'è un'opzione per file lingua (che ho davvero capito ma non è menzionato nel link qui sotto):

{-# LANGUAGE CPP #-} 

Per Cabal, è possibile use the extensions field. Per citare, dal momento che cita questo caso d'uso molto:

estensioni: elenco degli identificatori

un elenco di estensioni Haskell utilizzati da tutti i moduli. I nomi delle estensioni sono i costruttori del tipo di estensione. Questi determinano le corrispondenti opzioni del compilatore. In particolare, CPP specifica che i file di origine Haskell devono essere pre-elaborati con un preprocessore C.

estensioni utilizzate solo da un modulo possono essere specificati mettendo un pragma lingua nel file sorgente colpite, per esempio: {- # LINGUA CPP, MultiParamTypeClasses # -}

+4

Mentre GHC ha '-cpp', non è '{- # LANGUAGE CPP # -}' preferito per file? – Zeta

Problemi correlati