質問
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--コンパイラそれ自体。