您能否提供一段代码片段来展示如何使用 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;;

再说一次,我不知道你会在哪里获得绑定 LuaLuaL 模块。

其他提示

经过进一步思考,我不确定你是否可以用 Lua 的官方 C 实现来做到这一点,因为我认为 OCaml 相信它拥有 main(). 。您必须确定 OCaml 是否可以从 C 主程序打包为库。

对于让 Lua-ML 负责的示例,您可以得到 Lua-ML 独立版 来自 Cminusminus.org,您还可以查看以下示例 关于 Lua-ML 的论文 以及源代码 QC--编译器 本身。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top