将Lua嵌入到OCaml中。

请问,能否给出一个示例代码,展示如何在 OCaml 中嵌入 Lua?

一个简单的例子可以是“Hello, World”变量。让 OCaml 提示用户输入姓名。然后将该姓名传递给 Lua 函数。让 Lua 打印问候语并返回名称的长度。然后让 OCaml 打印有关名称长度的消息。

示例:

user@ desktop:~$ ./hello.opt

名字?**用户**

你好,用户。

您的名字有 4 个字母。

user@ desktop:~$

[编辑]

作为非 C 程序员,我是否可以在无需编写中间件的情况下实现这一点,以在 Lua 和 OCaml 之间传递数据?

以下是我想尝试的理论想法。不幸的是,ocaml_hello.ml 的第3行需要知道如何调用 lua_hello.lua 中定义的函数才能使代码有效。

lua_hello.lua 定义了 lua_hello,它打印参数并返回其长度。

1  function lua_hello (name)
2    print ("你好,"..name.."。")
3    return (string.len (name))
4  end

ocaml_hello.ml OCaml 提示输入名称,调用 Lua 函数并打印返回值。

1  let () = print_string "名称?"; flush stdout in
2  let name = input_line stdin in
3  let len  = Lua_hello.lua_hello name in
4    Printf.printf "你的名字有 %d 个字母。长度;刷新 stdout;

原文链接 https://stackoverflow.com/questions/405995

点赞
stackoverflow用户41661
stackoverflow用户41661

我不知道是否存在一个成熟的嵌入C实现Lua的OCaml绑定集。但是,在2004年的Caml邮件列表中发布了一组不成熟的绑定(链接:http://tinyurl.com/9cx5xm)。

如果您想使用ML实现,可以在一篇名为《ML Module Mania》的论文中找到一些示例(链接:http://www.cs.tufts.edu/~nr/pubs/maniaws-abstract.html)。与C实现不同,ML实现保证类型安全,但为了达到这一点,它在ML模块系统中使用了一些非常危险的技巧。如果您问基本问题,您可能应避免使用此项功能。

在您的示例中,很难猜出您想从哪个函数中获取信息。我建议您要么请求一个C的示例,要么给大家提供一个C示例,并询问如何在OCaml中实现它(尽管我认为绑定会是个问题)。


编辑

针对修订后的问题,情况非常复杂。通常的模型是您将Lua控制权交给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-02 04:39:08
stackoverflow用户41661
stackoverflow用户41661

进一步思考后,我不确定是否可以使用Lua的官方C实现来完成这个操作,因为我认为OCaml会认为它拥有main()。你需要找出是否可以将OCaml包装为C main程序的库。

如果要将Lua-ML置于控制状态的示例,请从Cminusminus.org获取Lua-ML独立版,您还可以查看Lua-ML论文中的示例以及QC--编译器本身的源代码。

2009-01-05 17:44:28