在Luam中嵌入Lua

时间:2009-01-02 04:12:58

标签: lua embed ocaml

请您提供一个代码段,说明如何在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;;

2 个答案:

答案 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;;

同样,我不知道你会在哪里获得LuaLuaL模块的绑定。

答案 1 :(得分:0)

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

有关让Lua-ML负责的示例,您可以从Cminusminus.org获取Lua-ML standalone,还可以查看paper on Lua-ML中的示例以及该代码的源代码。 QC-- compiler本身。