gpt4 book ai didi

lua - 在 OCaml 中嵌入 Lua

转载 作者:行者123 更新时间:2023-12-04 11:46:23 24 4
gpt4 key购买 nike

能否请您提供一个代码片段来展示如何使用嵌入在 OCaml 中的 Lua?
一个简单的示例可能是“Hello, World”变体。让 OCaml 提示用户输入名称。然后将该名称传递给 Lua 函数。让 Lua 打印一个问候语并返回名称的长度。然后让 OCaml 打印一条关于名称长度的消息。
例子:

user@desktop:~$ ./hello.opt

Name? User

Hello, User.

Your name is 4 letters long.

user@desktop:~$


[编辑]
作为非 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;;

最佳答案

我不知道有一套成熟的绑定(bind)将 Lua 的 C 实现嵌入到 OCaml 中。一组不成熟的绑定(bind)是 posted on the Caml mailing list in 2004 .

如果您想使用 ML 实现,您可以在一篇名为 ML Module Mania 的论文中找到一些示例。 .与 C 实现不同,ML 实现保证了类型安全,但为了做到这一点,它在 ML 模块系统中使用了一些非常糟糕的技巧。如果您问的是基本问题,您可能希望避免这种情况。

在您的示例中,很难猜测您希望该函数来自何处。我建议您要么要求一个 C 示例,要么给人们一个 C 示例,然后询问如何在 OCaml 中实现它(尽管我认为绑定(bind)将是一个问题)。

编辑

在回答修改后的问题时,它非常复杂。通常的模型是让 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 的绑定(bind)。和 LuaL模块。

关于lua - 在 OCaml 中嵌入 Lua,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/405995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com