您能否提供一个代码片段,展示如何在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;;
Norman Ramse.. 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;;
同样,我不知道你将在哪里获得Lua
和LuaL
模块的绑定.
我不知道有一套成熟的绑定用于将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;;
同样,我不知道你将在哪里获得Lua
和LuaL
模块的绑定.