LuaからC言語の関数を呼び出すC言語側からLuaの関数を呼び出すのはその2「Luaスクリプト事始め」で説明しました。Luaステートがうまいこと仲立ちしてくれているためとっても簡単です。Luaスクリプト側からC言語の関数を呼び出すにはどうしたらよいか?この章ではその辺りを掘り下げていきます。Luaを扱う上でとっても重要な部分です。0.1;endstartとendの値の補間値を取得するLinear関数を使っています。この関数はLuaのライブラリにはありません。無いのに使おうとしている。当然ですが、このままだとエラーとなります。実はこのLuaスクリプトを呼び出してもエラーにならなくする方法があります。それは、このスクリプトを呼び出す前にLuaステートに「Linear関数を登録」してあげればいいんです。0.1;endこれはOK、ちゃんと動きます。Lua側で作った関数を呼び出すのであればこれで十分です。Luaが最初から用意してあるかのように関数を使いたい、いちいちrequire関数を定義するのが面倒だ、そして「Luaで作った関数が遅い」などの理由から、この関数登録をC言語側からする場合もあります。この章の本題はこちらです。C言語で先程の線形補間関数を実際に作ってみましょう。end;};じゃぁ、これをLuaステートに登録して...と言いたくなるのですが、これは「できません」。え〜〜っと思うのですが、それは当然でして、LuaにしてみればC言語の関数は他国の言語。誰かに翻訳してもらわないとわかりません。この翻訳は普通であれば時間を要します。そこで、Luaはただ一つだけ自分で解釈できる言語の関数型を定めました。0;};Luaステートは「引数がlua_Stateへのポインタで戻り値がint型」の関数を「C言語側での関数型」としてLuaが認識でいる唯一の関数として定義しています。具体的な登録例を挙げながら説明します。&FuncC);lua_register関数は第3引数のLuaが認識可能な関数を第2引数の名前でLuaステートにグローバル関数として登録します。これでLua側からは、code.luaFuncC();と、C言語側で登録した関数を、lua_registerの第2引数の名前で呼び出す事ができるようになります。「じゃ、じゃぁ、引数がfloat3つで、戻り値もfloatなLinear関数を登録するにはどうしたらいいの?」となりますね。それは、次で説明します。引数がfloat3つ、戻り値がfloatのLinear関数をLua側で呼び出すLuaステートが認識出来る関数はlua_State*型を引数としint型を返す関数のみです。Function)」と呼ばれています。意味としては、C言語関数とLua関数の仲立ちをする(くっつける:glue)関数です。Luaから登録したグルー関数を呼び出すと、引数のlua_State内のスタックにLua側で渡された引数が積まれてグルー関数がコールバックされてきます。1;}Lua内でLinear関数が上のように呼ばれたとすると、C言語側のLinear関数の引数lua_Stateには呼ばれた順に値がスタックに積まれてやってきます。そこでまずその引数を取得します。続いて、その値を用いてやりたい補間計算をします。その結果をLua側に返す必要があるのですが、これもスタックに積みます。その前に今の引数のスタックを削除します。関数の戻り値はその戻り値の個数です。スタックに複数の値を積めば、複数の値を返せるんです。このグルー関数を登録してLuaスクリプトを実行すると、確かに次のような出力結果を得られます:同じような登録をC言語側で行えば、Luaスクリプトで「C言語側できっと登録してくれているに違いない」という暗黙の約束のもと、様々な便利関数を使うことができるようになるわけです。線形補間だけでなく別の複雑な補間とか、数学関数のみならずゲーム用の様々な関数をC言語側で作り、それをスクリプトを走らせる前にLuaスクリプトに登録しておけば、Luaスクリプトがどんどんと便利になっていくんです。*L)」です(関数名は任意)。これはグローバル領域にある関数です。逆に言えばこれ以外の関数は一切登録できないという事です。Lua側でゲーム画面のレイアウトを制御するとしましょう。最初に物を置くウィンドウを得て、それに文字描画用の部品を指定の箇所に置くとします。200);とってもわかりやすくて楽しい感じなのですが、これをグルー関数だけで実現するにはC言語側でかなりの準備が必要になります。噛み砕いていけば、解決策が見えてくると思います。次の章からその辺りを攻めてみます。