2014-10-22 12 views
6

Muszę sprawić, że niektóre małe bloki mojego programu zachowują się inaczej na różnych platformach. Wygląda na to, że GHC nie jest zbyt dobry w kompilacji krzyżowej, więc planuję skompilować ten sam kod w systemach Linux i Windows.Rozwój wielu platform w Haskell

Jaki jest zalecany sposób osiągnięcia tego? Czy muszę napisać wiele wersji jednego modułu, czy istnieje coś takiego jak dyrektywy preprocesora, które mogę umieścić w swoim kodzie, aby warunkowo skompilować jeden blok kodu lub inny?

P.S. Używam GHC i Cabal do zarządzania.

Odpowiedz

6

GHC obsługuje running your code through a C preprocessor. Nie jest to rozwiązanie bardzo Haskelly, ale jest to, co jest używane w praktyce, gdy jest to konieczne.

EDIT: Zeta wskazał, istnieje opcja per-plik językowy do tego (co ja tak naprawdę nie wiedział, ale to nie jest wymienione w powyższym linku):

{-# LANGUAGE CPP #-} 

Dla Cabal, można use the extensions field. Zacytować, gdyż wspomina tę samą sprawę zastosowanie:

rozszerzeń: lista identyfikator

Lista rozszerzeń Haskell używanych przez każdego modułu. Nazwy rozszerzeń są konstruktorami typu Extension. Określają one odpowiednie opcje kompilatora. W szczególności CPP określa, że ​​pliki źródłowe Haskell mają być wstępnie przetwarzane za pomocą preprocesora C.

Rozszerzenia używane tylko przez jeden moduł może być określona poprzez umieszczenie pragmy języka w pliku źródłowym wpływ, np: {- # JĘZYK CPP, MultiParamTypeClasses # -}

+4

Podczas GHC ma '-cpp', Czy nie jest preferowane '{- # LANGUAGE CPP # -}' na podstawie pliku? – Zeta

Powiązane problemy