Funciones de Call C de Haskell en tiempo de ejecución
dynamic ffi (1)
Importación dinámica
Si puede enumerar todos los tipos posibles para las funciones C que pueden llamarse, entonces puede usar la capacidad de importación dinámica de la FFI ( http://www.haskell.org/onlinereport/haskell2010/haskellch8.html ). Una función de importación dinámica envuelve una función C en tiempo de ejecución. Deberá declarar una función de importación para cada tipo de función C a la que pueda llamar. (En realidad, solo importa ABI, por lo que puede tratar todos los tipos de punteros C como equivalentes).
foreign import ccall "dynamic" mkPtrFun :: FunPtr (Ptr () -> IO (Ptr ())) -> Ptr () -> IO (Ptr ())
Si tiene un puntero a una función C, puede hacerlo invocable desde Haskell usando esta función de envoltura.
callWithNull :: FunPtr (Ptr a -> IO (Ptr ())) -> IO (Ptr ())
callWithNull f = mkPtrFun f nullPtr
Si los tipos de las funciones C se desconocen cuando se compila el código Haskell, entonces no puede hacer esto con el FFI.
Carga dinámica
En cuanto a obtener punteros de función C dinámicamente, el FFI no lo ayuda. Puede usar bibliotecas de carga dinámica en C, como libdl. Vea las páginas man: http://linux.die.net/man/3/dlopen .
Estoy construyendo un intérprete para un lenguaje de programación dinámico en Haskell. Me gustaría agregar un mecanismo simple para llamar a las funciones C. En el pasado, he usado el Haskell FFI para llamar a las funciones C que explícitamente había declarado el nombre y el tipo de; este enfoque no funcionará aquí porque el intérprete no sabrá el nombre o tipo de las funciones C que se llamarán hasta el tiempo de ejecución.
¿Es posible declarar y llamar a las funciones C en tiempo de ejecución? ¿Dónde debería comenzar?