0Pricing
Lua Academy · レッスン

LuaへのC関数の登録

luaL_registerとlua_pushcfunctionを使ってC関数をLuaスクリプトに公開します。

「LuaへのC関数の登録」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

概要

C関数はLuaスクリプトに公開できます。関数のシグネチャはint myFunc(lua_State *L)でなければなりません。関数はスタックから引数を読み取り、戻り値をpushします。

C関数のシグネチャ

Luaから呼び出せるすべての関数はlua_CFunctionです。lua_State*を受け取り、引数を読み取り、結果をpushして、結果の個数を返します。

// C code
static int l_add(lua_State *L) {
  double a = luaL_checknumber(L, 1);
  double b = luaL_checknumber(L, 2);
  lua_pushnumber(L, a + b);
  return 1;  // one result
}

グローバルとして登録する

lua_pushcfunction(L, l_add)でC関数をpushし、続いてlua_setglobal(L, "add")でLuaのグローバル関数として登録します。

// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)

luaL_newlib / luaL_register

luaL_Reg配列とluaL_newlibを使って、複数のC関数をLuaモジュールとして登録します。

// C code
static const luaL_Reg mylib[] = {
  {"add", l_add},
  {"mul", l_mul},
  {NULL, NULL}
};
luaL_newlib(L, mylib);
lua_setglobal(L, "mylib");
// Lua: mylib.add(1, 2)

引数の読み取り

luaL_checknumber(L, n)やluaL_checkstring(L, n)などは、引数を読み取って検証し、型が正しくない場合はLuaエラーを発生させます。

複数の値を返す

複数の値をpushし、その個数を返します。Luaはそれらを複数の戻り値として割り当てます。

// C code
static int l_divmod(lua_State *L) {
  int a = luaL_checkinteger(L, 1);
  int b = luaL_checkinteger(L, 2);
  lua_pushinteger(L, a / b);
  lua_pushinteger(L, a % b);
  return 2;  // two results
}

Cクロージャのupvalue

Cクロージャは、登録時にlua_pushcclosure(L, fn, n)を使ってupvalueを捕捉します。lua_upvalueindex(n)でupvalueにアクセスできます。

Cからのエラー報告

C関数からLuaエラーを発生させるには、luaL_error(L, format, ...)を呼び出します。この関数は戻らず、保護された呼び出しのハンドラーへlongjmpします。

// C code
if (divisor == 0)
  luaL_error(L, "division by zero at argument %d", 2);

.so/.dllとしてのCモジュール

Cモジュールはluaopen_modname関数を公開します。Luaのrequireが共有ライブラリを読み込み、モジュールを初期化するためにこの関数を呼び出します。

// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
  luaL_newlib(L, mymod_funcs);
  return 1;
}

引数の個数チェック

lua_gettop(L)を使って渡された引数の個数を確認します。luaL_checkany(L, n)は、少なくともn個の引数が渡されていることを保証します。

LuaJIT FFIという選択肢

LuaJITのFFIを使うと、Cのラッパーコードを書かずにLuaからC関数を直接呼び出せます。単純な関数呼び出しだけなら、多くの場合こちらの方が簡単です。より深い統合にはC APIが必要です。

C関数に関する質問

Luaから呼び出せるC関数は何を返す必要がありますか?

復習:C関数の登録

Luaから呼び出せるC関数のシグネチャはint f(lua_State*)です。luaL_check*で引数を読み取り、結果をpushして、個数を返します。lua_pushcfunctionで個別に、またはluaL_newlibでまとめて登録します。

よくある質問

「LuaへのC関数の登録」レッスンは無料ですか?

はい。「LuaへのC関数の登録」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「LuaへのC関数の登録」で何を学びますか?

luaL_registerとlua_pushcfunctionを使ってC関数をLuaスクリプトに公開します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「LuaへのC関数の登録」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Lua C APIのスタックモデル
  2. CからのLua関数呼び出し
  3. LuaへのC関数の登録
  4. 状態管理とエラー処理
← Lua Academyに戻る