当前位置:  开发笔记 > 编程语言 > 正文

在Luam中嵌入Lua

如何解决《在Luam中嵌入Lua》经验,为你挑选了1个好方法。

您能否提供一个代码片段,展示如何在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;;

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



1> Norman Ramse..:

我不知道有一套成熟的绑定用于将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;;

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

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有