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
La documentación de GHC tiene una sección relacionada con el preprocesador C que documenta algunas de las macros predefinidas del preprocesador.
La documentación de Cabal tiene una sección relacionada con la compilación condicional que da un ejemplo relacionado con la base
. Si está escribiendo un paquete portátil, debe usar Cabal, de todos modos.
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.