题
您能否提供一段代码片段来展示如何使用 OCaml 中嵌入的 Lua?
一个简单的例子就是“Hello, World”的变体。让 OCaml 提示用户输入名称。然后将该名称传递给 Lua 函数。让 Lua 打印问候语并返回姓名的长度。然后让 OCaml 打印一条有关名称长度的消息。
例子:
用户@桌面:~$ ./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.mlOCaml 提示输入名称,调用 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;;
解决方案
我不知道有一套成熟的绑定可以将 Lua 的 C 实现嵌入到 OCaml 中。一组不成熟的绑定是 2004 年发布在 Caml 邮件列表上.
如果您想使用 ML 实现,您可以在名为的论文中找到一些示例 机器学习模块狂热. 。与 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
模块。
其他提示
经过进一步思考,我不确定你是否可以用 Lua 的官方 C 实现来做到这一点,因为我认为 OCaml 相信它拥有 main()
. 。您必须确定 OCaml 是否可以从 C 主程序打包为库。
对于让 Lua-ML 负责的示例,您可以得到 Lua-ML 独立版 来自 Cminusminus.org,您还可以查看以下示例 关于 Lua-ML 的论文 以及源代码 QC--编译器 本身。