haskell ghc c-preprocessor

haskell - ¿Dónde puedo aprender sobre#ifdef?



ghc c-preprocessor (4)

Además de las banderas muy útiles definidas por GHC (sistema operativo, arquitectura, etc.), cuando se utiliza cabal, se definen otras banderas y macros.

Verifique las versiones del paquete

Este es un uso de crypto-api que verifica la versión del paquete tagged que se utiliza:

#if MIN_VERSION_tagged(0,2,0) import Data.Proxy #endif

CPP personalizado define según las banderas de Cabal

Puede definir símbolos CPP que dependen de banderas de cabal. Aquí hay un ejemplo (innecesariamente complejo) de pureMD5 (del archivo .cabal):

if arch(i386) || arch(x86_64) cpp-options: -DFastWordExtract

Dentro del módulo .hs puedes usar #ifdef , por ejemplo:

#ifdef FastWordExtract getNthWord n b = inlinePerformIO (unsafeUseAsCString b (flip peekElemOff n . castPtr)) #else ... other code ... #endif

Para más información, puede ver la guía de usuarios de Cabal. Esta página tiene la información de "compilación condicional" que probablemente esté buscando.

Veo que esto se usa a menudo para hacer que los módulos sean compatibles con GHC y Hugs, pero Google no me está ayudando a aprender más al respecto.

¿Qué puedo poner dentro del condicional? ¿Puedo condicionar partes de un módulo a qué versión de ''base'' está en uso?

EDIT 3/2017 : Este es un gran recurso: https://guide.aelve.com/haskell/cpp-vww0qd72



Si ejecuta su compilador Haskell con la opción -cpp , primero preprocesará los archivos fuente con el CPP (Preprocesador C).

Eche un vistazo a la sección 4.11.3. Opciones que afectan al preprocesador C here .


#ifdef y amigos son utilizados por el preprocesador C (CPP). Proporcionan una forma de compilar el código condicionalmente. Puede habilitar el uso del CPP agregando el pragma {-# LANGUAGE CPP #-} en la parte superior de un archivo.

Muchos programas que tratan con el código Haskell establecen algunas macros para el preprocesador (por ejemplo, GHC establece __GLASGOW_HASKELL__ a la versión de GHC), por lo que uno puede compilar el código de forma condicional, por ejemplo, para usar diferentes bibliotecas properitarias para Abrazos y GHC.