2011-05-04 20 views
7

Tengo algunas preguntas acerca de la FFI en HaskellFFI en Haskell, pregunta sobre el CPP IDIOMA y cómo utilizar ac estructura con la FFI

  1. Sé que debe utilizar el pragma lenguaje {-# LANGUAGE ForeignFunctionInterface #-} pero ¿cuál es la diferencia cuando uso {-# LANGUAGE CPP, ForeignFunctionInterface #-} ¿qué puedo hacer "más" con el CPP
  2. uso una función en c que usa un struct, ¿cómo puedo manejar esto en el FFI?
  3. cuando tengo que usar CInt y cuando solo Int?

Respuesta

6
  1. Si habilita la extensión CPP idioma, a continuación, puede encorporate legalmente sintaxis pre-procesador de C en su programa de Haskell.
  2. Para acceder a una estructura es un poco más complicado. La forma más fácil es, probablemente, utilizar the Storable typeclass para definir los métodos peek y poke para cada campo de la estructura. La herramienta hsc2hs puede ayudar.
  3. CInt se utiliza cada vez que necesita para pasar una Haskell Int hacia o desde C, ya que esto garantizará ninguna de clasificación requerida se lleva a cabo (mismo ocurre con CDouble, CString y así sucesivamente).

El paquete X11 tiene many examples de definir y organizar las estructuras a través del FFI.


Más información en:

+0

tengo una función c como: int foo(); debo escribir en la firma de haskell Int o CInt, sofar i jzst usado Int finalizar todo el trabajo – ewggwegw

+0

@ewggwegw: Para la función en sí, use CInt. El uso de Int puede o no funcionar, dependiendo de su plataforma. – fuz

+0

'llamada de importación extranjera" foo "c_foo :: IO CInt', por ejemplo. –

3
  1. CPP es el preprocesador C. Le permite usar compilación condicional y makros. Por lo general, no es necesario, pero se vuelve útil tan pronto como tenga un código dependiente de la plataforma, donde el código para compilar se decide mediante un script externo (como con las herramientas automáticas).
  2. Eche un vistazo a c2hs
  3. Utilice Cint solo para la importación directa. Al escribir un enlace de alto nivel, cambie a Int ya que no requiere que el usuario importe las bibliotecas requeridas y es el estándar Haskell
Cuestiones relacionadas