2

この質問への回答を使用して、luaprintを文字列ストリームにリダイレクトしています。私の機能コードは以下の通りです。

私の問題は、コードが常に lua が独自に出力したものと一致するとは限らないことです。最も顕著なのは、関数を印刷しようとすると、関数とアドレスではなく、関数だけを取得することです。例:

> --in lua
> print(os.exit)
function: 0xabcdef01

> --in my interpreter
> print(os.exit)
function

明らかな解決策は、(デフォルトの print のように)tostring書き込む前に、カスタムの print 関数に強制的に lua を呼び出させることです。luaoutただし、これを機能させる方法が本当にわかりません。誰かが私を助けてくれれば、とても感謝しています。

これが私のカスタムプリントです:

static int l_my_print(lua_State* L) {
    int nargs = lua_gettop(L);

    for (int i=1; i <= nargs; i++) {
        int t = lua_type(L, i);
        switch (t) {
            case LUA_TSTRING: { /* strings */
                luaout << lua_tostring(L, i);
                break;
            }
            case LUA_TBOOLEAN: { /* booleans */
                luaout << (lua_toboolean(L, i) ? "true" : "false");
                break;
            }
            case LUA_TNUMBER: { /* numbers */
                luaout << lua_tonumber(L, i);
                break;
            }
            default: { /* other values */
                luaout << lua_typename(L, t);
                break;
            }
        }
        if (i!=nargs){
            luaout << "\t";
        }
    }
    luaout << endl;

    return 0;
}
4

1 に答える 1

4

デフォルトでこれを試すことができます:

lua_pushfstring(L, "%s: %p", luaL_typename(L, i), lua_topointer(L, i));

また

 luaout << luaL_typename(L, i) << ": " << lua_topointer(L, i);

これにより、関数の名前とポインターが追加されます。

C++ から lua 関数を呼び出すことができます (テストしていないため、動作することを保証するものではありませんが、文法エラーは別として動作するはずです)。

lua_getglobal(L, "tostring");
lua_pushvalue (L, i);

if (lua_pcall(L, 1, 1, 0) != 0) {
        printf("error running function `%s': %s\n", "tostring", lua_tostring(L, -1));
        return -1;
}
// get result
char *result = luaL_checkstring (L, -1);
于 2012-10-08T13:26:00.330 に答える