memo

STATUS: 故障中

 マニュアル読みながら luaいじってました。
 以下メモ。

        lua_pushstring(L, "foobar");
        lua_gettable(L, LUA_GLOBALSINDEX);

        lua_getglobal(L,"foobar");
は等価。lua_getglobalは、マクロ。

 lua_getglobalの処理は、スタックトップにある文字列を(関数や変数の)シンボル名とみなして(関数や変数を保持している?)グローバルテーブルからポインタを持ってきてスタックに積むという動作なのかな?

APIの一覧はLua - APIが便利。

 各サイトのサンプルでは、luaの関数をcallした戻り値を取得するために lua_tonumber(L, 1) としている。
 スタックの絶対位置「1」を指定しているが、lua_tonumber(L, -1)としてスタックトップからの相対位置で値を取ったほうが安全なのでは?

 lua_tonumber関数ではスタックの指定位置の値を読むだけでpopはされない。

 スタック操作の関数名に混乱。forth見たいな関数名だったらよかったのに。popすらマクロ。

 挙動を調べる
 printf("statck top:%d\n" , lua_gettop(L) );
をあちこちに埋め込んで、スタックの数(スタックトップのインデックス)を調べる。

スタックの内容を表示するテスト関数。
void printstack( lua_State *L ) {
        for ( int i=1; i<=lua_gettop(L); i++ ) printf("%d ",(int)lua_tonumber(L,i));
        printf("*\n");
}

値の型表示付
void printstack( lua_State *L ) {
        for ( int i=1; i<=lua_gettop(L); i++ )
                printf("%s:%d ", lua_typename( L , lua_type(L,i)) ,(int)lua_tonumber(L,i));
        printf("*\n");
}

 ハンガリアン記法信者としては、サンプル中の L は、pL とかにしたい。

 スレッドの作り方は読んだ。
 lua_yield関数の使いどころがよくわからない。
 luaスクリプト内で yeieldされて戻ってきたときに、lua_resume しないでlua_yieldするとスレッドが終了するのかな?

コメント