7

OCaml に組み込まれた Lua の使用方法を示すコード スニペットを教えてください。

簡単な例としては、"Hello, World" バリアントが考えられます。OCaml でユーザーに名前の入力を求めるようにします。次に、その名前を Lua 関数に渡します。Lua に挨拶を出力させ、名前の長さを返します。次に、OCaml に名前の長さに関するメッセージを表示させます。

例:

user@desktop:~$ ./hello.opt

名前?ユーザー

こんにちは、ユーザーです。

あなたの名前は4文字です。

user@desktop:~$

[編集]

非 C プログラマーとして、Lua と OCaml の間でデータを渡すための中間 C プログラムを作成することなく、これを実装できますか?

以下は、私が試してみたいことの理論的な考えです。残念ながら、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;;
4

2 に答える 2

8

LuaのC実装をOCamlに埋め込むための成熟したバインディングのセットを私は知りません。未熟なバインディングのセットが2004年にCamlメーリングリストに投稿されました

ML実装を使用する場合は、 MLModuleManiaという論文でいくつかの例を見つけることができます。ML実装は、C実装とは異なり、型の安全性を保証しますが、そうするために、MLモジュールシステムでいくつかの非常に壊血病のトリックを使用します。基本的な質問をしている場合は、おそらくこれを避けたいと思うでしょう。

あなたの例では、関数をどこから取得したいかを推測するのは少し難しいです。Cの例を求めるか、Cの例を示して、OCamlでどのように実現できるかを尋ねることをお勧めします(ただし、バインディングは問題になると思います)。


編集

改訂された質問への回答として、それはかなり複雑です。通常のモデルでは、Luaを担当し、LuaからObjectiveCamlコードを呼び出します。あなたは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モジュールのバインディングをどこで入手できるかわかりません。

于 2009-01-02T04:39:08.220 に答える
0

さらによく考えてみると、Lua の公式 C 実装でこれを実行できるかどうかはわかりません。OCaml はmain(). OCaml を C のメイン プログラムからライブラリとしてパッケージ化できるかどうかを調べる必要があります。

Lua-ML を担当させる例については、Cminusminus.org からLua-ML スタンドアロンを入手できます。また、Lua-ML に関する論文の例と、 QC コンパイラのソース コードを確認することもできます。自体。

于 2009-01-05T17:44:28.420 に答える