Pregunta

¿Podría, por favor, dar un fragmento de código que muestre cómo usar Lua incrustado en OCaml?

Un ejemplo simple podría ser un "Hola, Mundo" variante. Haga que OCaml solicite al usuario un nombre. Luego pase ese nombre a una función Lua. Haga que Lua imprima un saludo y devuelva la longitud del nombre. Luego haga que OCaml imprima un mensaje sobre la longitud del nombre.

Ejemplo:

  

usuario @ escritorio: ~ $ ./hello.opt

     

Nombre? Usuario

     

Hola, usuario.

     

Su nombre tiene 4 letras de largo.

     

usuario @ escritorio: ~ $

[Editfont>

Como programador que no es C, ¿podría implementar esto sin tener que escribir un programa C intermedio para pasar los datos entre Lua y OCaml?

A continuación hay una idea teórica de lo que me gustaría probar. Desafortunadamente, la línea 3 de ocaml_hello.ml necesitaría saber cómo llamar a la función definida en lua_hello.lua para que el código sea válido.

lua_hello.lua Define lua_hello, que imprime un argumento y devuelve su longitud.

1  function lua_hello (name)
2    print ("Hello, "..name..".")
3    return (string.len (name))
4  end

ocaml_hello.ml OCaml solicita un nombre, llama a la función Lua e imprime el valor de retorno.

1  let () = print_string "Name? "; flush stdout in
2  let name = input_line stdin in
3  let len  = Lua_hello.lua_hello name in
4    Printf.printf "Your name is %d letters long." len; flush stdout;;
¿Fue útil?

Solución

No conozco un conjunto maduro de enlaces para integrar la implementación C de Lua en OCaml. Un conjunto inmaduro de enlaces fue publicado en la lista de correo de Caml en 2004 .

Si desea utilizar la implementación de ML, puede encontrar algunos ejemplos en un documento llamado ML Module Mania . La implementación de ML, a diferencia de la implementación de C, garantiza la seguridad de los tipos, pero para hacerlo utiliza algunos trucos de escorbuto en el sistema de módulos de ML. Si está haciendo preguntas básicas, probablemente quiera evitar esto.

En su ejemplo, es un poco difícil adivinar de dónde quiere que provenga la función. Le sugiero que solicite un ejemplo de C o le dé a la gente un ejemplo de C y pregunte cómo podría realizarse en OCaml (aunque creo que los enlaces serán un problema).


Editar

En respuesta a la pregunta revisada, es bastante complicado. El modelo habitual es que pondría a Lua a cargo y llamaría al código Objective Caml desde Lua. Estás poniendo a Caml a cargo, lo que hace las cosas más complicadas. Aquí hay un bosquejo de cómo se verían las cosas:

let lua = Lua.new()  (* create Lua interpreter *)
let chunk = LuaL.loadfile lua "hello.lua" (* load and compile the file hello.lua *)
let _ = Lua.call lua 0 0 (* run the code to create the hello function *)
let lua_len s =
  (* push the function; push the arg; call; grab the result; pop it; return *)
  let _ = Lua.getglobal lua "lua_hello" in
  let _ = Lua.pushstring lua s in
  let _ = Lua.call lua 1 1 in
  let len = Lua.tointeger lua (-1) in
  let _ = Lua.pop lua 1 in
  len

let () = print_string "Name? "; flush stdout
let name = input_line stdin
let len  = lua_len name
Printf.printf "Your name is %d letters long." len; flush stdout;;

Nuevamente, no sé de dónde obtendrá los enlaces para los módulos Lua y LuaL .

Otros consejos

En una reflexión más profunda, no estoy seguro si puede hacer esto con la implementación oficial de C de Lua, porque creo que OCaml cree que posee main () . Tendría que averiguar si OCaml podría empaquetarse como una biblioteca desde un programa principal de C.

Para un ejemplo de cómo poner a cargo Lua-ML, puede obtener Lua-ML independiente de Cminusminus.org, y también puede consultar los ejemplos en documento sobre Lua-ML , así como el código fuente del QC-- compilador en sí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top