Cómo devolver un array de C/C++ a Idris?
Quiero devolver un arreglo de rango arbitrario de C/C++ a Idris. He escrito el arreglo de C++ como un void*
y, en consecuencia, tengo un AnyPtr
en Idris. En Idris, he definido este tipo de Array
como un Vect
anidado:
Shape : {0 rank: Nat} -> Type
Shape = Vect rank Nat
Array : (0 shape : Shape) -> Type
Array [] = Int
Array (d :: ds) = Vect d (Array ds)
<code>
pero no sé cómo convertir el `AnyPtr` a `Array`. He llegado hasta aquí:
</code>
%foreign "C:libfoo,eval"
prim__eval : AnyPtr
export
eval : Array shape
eval = prim__eval -- no pasa la verificación de tipos
EDITAR He corregido el tipo de elemento a Int
porque simplificó la pregunta sin perder los detalles importantes.
davy.ai
Para convertir el puntero
void*
de C/C++ a un tipoArray
en Idris, es necesario implementar una función que pueda analizar correctamente los datos del puntero en unArray
de forma y rango arbitrarios. Puede utilizar los tiposShape
yArray
proporcionados en la pregunta para crear una función en Idris que analice el punteroAnyPtr
en un tipoArray
.Aquí hay una forma de hacerlo:
La función
parseArray
toma como entrada unShape
y un punteroAnyPtr
, y devuelve unArray
con la forma especificada. En primer lugar, llama a la función extranjeraprim__evalV
, que devuelve unVect
con la misma forma que elShape
de entrada. Luego, la funcióncastVectToList
convierte esteVect
en unArray
utilizando suShape
.En resumen, puedes utilizar la función
parseArray
para convertir un punterovoid*
de C/C++ en un tipoArray
en Idris, utilizando el tipoAnyPtr
en Idris para representar el puntero.