Incrustar Lua en OCaml
embed (2)
¿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 una variante "Hello, World". Haga que OCaml solicite un nombre para el usuario. Luego pasa 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 es 4 letras de largo.
usuario @ escritorio: ~ $
[Editar]
Como programador no 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;;
No estoy al tanto de 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 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 del tipo, pero para hacerlo utiliza algunos trucos muy escépticos en el sistema de módulos ML. Si haces preguntas básicas, probablemente quieras evitar esto.
En su ejemplo, es un poco difícil adivinar de dónde quiere que venga la función. Sugiero que solicite un ejemplo en C o que le dé a la gente un ejemplo de C y pregunte cómo se podría realizar en OCaml (aunque creo que las consolidaciones serán un problema).
Editar
En respuesta a la pregunta revisada, es bastante complicado. El modelo habitual es que pondrías a Lua a cargo, y llamarías al código de 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;;
De nuevo, no sé de dónde obtendrás los enlaces para los módulos Lua
y LuaL
.
En una reflexión más profunda, no estoy seguro si puedes hacer esto con la implementación oficial 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 C.
Para un ejemplo de poner Lua-ML a cargo, puede obtener Lua-ML de forma independiente de Cminusminus.org, y también puede consultar los ejemplos en el documento sobre Lua-ML , así como el código fuente del compilador de QC. sí mismo.