質問

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

簡単な例は、「こんにちは、世界」です。バリアント。 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;;
役に立ちましたか?

解決

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

ML実装を使用する場合は、 MLモジュールマニア。 ML実装は、C実装とは異なり、型の安全性を保証しますが、そうするために、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 モジュールのバインディングをどこで入手できるかわかりません。

他のヒント

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

Lua-MLを担当する例については、 Lua-MLスタンドアロン Cminusminus.orgから、また Lua-MLに関する論文および QC--コンパイラそれ自体。

scroll top