es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Convirtiendo string a lltype para poder utilizar struct_set_body?

Estoy tratando de generar LLVM ir, y actualmente tengo esto:

let fill_structs = StringMap.iter (fun k v -> L.struct_set_body k v false ) structs 
(* más declaraciones let...in *)

El mensaje de error que estoy obteniendo es sobre mi ‘k’ que paso a L.struct_set_body.

StringMap.key
This expression has type string but an expression was expected of type
  L.lltype

Mi comprensión de ocaml es débil, así que veo en aquí que struct_set_body hace esto:

lltype -> lltype array -> bool -> unit

Lo cual supongo que significa que toma un lltype array y un booleano, y devuelve unit. No lo sé, estoy pensando en esto de la forma en que pensaría en una firma de función en C o Java, pero no creo que sea la forma en que debería estar pensando en esto.

La otra cosa es que no sé cómo convertir mi cadena ‘k’ en un lltype para lograr lo que quiero hacer.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con el código es que el tipo de k se está inferiendo como string, pero L.struct_set_body espera un L.lltype como su primer argumento. En otras palabras, la cadena k necesita ser convertida a un L.lltype antes de que pueda ser pasada a L.struct_set_body.

    Para hacer esto, necesitarás tener un mapeo entre los nombres de tus estructuras (que son cadenas) y sus correspondientes L.lltype. Suponiendo que tienes este mapeo en un StringMap (como se muestra en el fragmento de código), puedes obtener el L.lltype para cada estructura con StringMap.find, y luego pasarlo a L.struct_set_body junto con el arreglo de tipos de elementos de la estructura y el valor booleano.

    Aquí tienes un ejemplo de cómo hacer esto:

    let fill_structs = 
      StringMap.iter (fun k v ->
        let lltype = StringMap.find k type_map in (* Obtener el lltype para la estructura k *)
        L.struct_set_body lltype v false
      ) structs 
    

    Esto iterará sobre cada estructura en structs, obtendrá su correspondiente L.lltype del type_map y luego establecerá su cuerpo usando L.struct_set_body.

Comments are closed.