请您提供一个代码段,说明如何在OCaml中使用Lua?
一个简单的例子可能是“Hello,World”变体。让OCaml提示用户输入名称。然后将该名称传递给Lua函数。让Lua打印问候语并返回名称的长度。然后让OCaml打印一条关于名称长度的消息。
示例:
user @ desktop:〜$ ./ hello.opt
名称? 的用户的的
您好,用户。
你的名字长4个字母。
用户@桌面:〜$
[编辑] 的
作为非C程序员,我是否可以实现这一点而无需编写中间C程序来在Lua和OCaml之间传递数据?
以下是我想尝试的理论概念。不幸的是,ocaml_hello.ml的第3行需要知道如何调用lua_hello.lua中定义的函数,以使代码有效。
lua_hello.lua 的 定义lua_hello,它打印一个参数并返回其长度。
1 function lua_hello (name)
2 print ("Hello, "..name..".")
3 return (string.len (name))
4 end
ocaml_hello.ml 的 OCaml提示输入名称,调用Lua函数,并打印返回值。
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;;
答案 0 :(得分:8)
我不知道有一套成熟的绑定用于将Lua的C实现嵌入到OCaml中。一组不成熟的绑定是posted on the Caml mailing list in 2004。
如果您想使用ML实现,可以在名为ML Module Mania的论文中找到一些示例。与C实现不同,ML实现保证了类型安全性,但是为了实现这一点,它在ML模块系统中使用了一些非常坏的技巧。如果你问基本问题,你可能想避免这个。
在你的例子中,有点难以猜测你想要函数的来源。我建议你要么提出一个C例子,要么给人们一个C例子,并询问如何在OCaml中实现它(虽然我认为绑定会成为一个问题)。
在回答修订后的问题时,它非常复杂。通常的模型是你会让Lua负责,你会从Lua调用Objective Caml代码。你让Caml负责,这让事情变得更复杂。这是一个粗略的草图,说明事情的样子:
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;;
同样,我不知道你会在哪里获得Lua
和LuaL
模块的绑定。
答案 1 :(得分:0)
经过进一步思考,我不确定你是否可以使用Lua的官方C实现来实现这一点,因为我认为OCaml认为它拥有main()
。您必须了解OCaml是否可以打包为C主程序库。
有关让Lua-ML负责的示例,您可以从Cminusminus.org获取Lua-ML standalone,还可以查看paper on Lua-ML中的示例以及该代码的源代码。 QC-- compiler本身。