将Lua嵌入到OCaml中。
2020-6-20 9:12:55
收藏:0
阅读:499
评论:2
请问,能否给出一个示例代码,展示如何在 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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我不知道是否存在一个成熟的嵌入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;;
同样,我不知道您将从哪里获取
Lua
和LuaL
模块的绑定。