7

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

2 回答 2

8

我不知道有一套成熟的绑定将 Lua 的 C 实现嵌入到 OCaml 中。一组不成熟的绑定于 2004 年发布在 Caml 邮件列表上

如果您想使用 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;;

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

于 2009-01-02T04:39:08.220 回答
0

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

有关 Lua-ML 负责的示例,您可以从 Cminusminus.org 获得独立的 Lua-ML,您还可以查看有关 Lua-ML 的论文中的示例以及QC-- 编译器的源代码本身。

于 2009-01-05T17:44:28.420 回答