zoukankan      html  css  js  c++  java
  • lua State加载部分库

        在lua中,通常我们用luaL_openlibs(L)加载所有的lub标准库,但是有时候我们想只加载部分,有没有什么好的办法呢?在luaproc看到如下办法:

    static void registerlib( lua_State *L, const char *name, lua_CFunction f ) {
        lua_getglobal( L, "package" );
        lua_getfield( L, -1, "preload" );
        lua_pushcfunction( L, f );
        lua_setfield( L, -2, name );
        lua_pop( L, 2 );
    }
    
    static void openlibs( lua_State *L ) {
        lua_cpcall( L, luaopen_base, NULL );
        lua_cpcall( L, luaopen_package, NULL );
        registerlib( L, "io", luaopen_io );
        registerlib( L, "os", luaopen_os );
        registerlib( L, "table", luaopen_table );
        registerlib( L, "string", luaopen_string );
        registerlib( L, "math", luaopen_math );
        registerlib( L, "debug", luaopen_debug );
    }
    int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);

    Calls the C function func in protected mode. func starts with only one element in its stack, a light userdata containing ud. In case of errors, lua_cpcall returns the same error codes as lua_pcall, plus the error object on the top of the stack; otherwise, it returns zero, and does not change the stack. All values returned by func are discarded.

    上面是5.1的做法。luaproc新做法如下:

     static void luaproc_reglualib( lua_State *L, const char *name,
                                    lua_CFunction f ) {
       lua_getglobal( L, "package" );
       lua_getfield( L, -1, "preload" );
       lua_pushcfunction( L, f );
       lua_setfield( L, -2, name );
       lua_pop( L, 2 );
     }
     
     static void luaproc_openlualibs( lua_State *L ) {
       requiref( L, "_G", luaopen_base, FALSE );
       requiref( L, "package", luaopen_package, TRUE );
       luaproc_reglualib( L, "io", luaopen_io );
       luaproc_reglualib( L, "os", luaopen_os );
       luaproc_reglualib( L, "table", luaopen_table );
       luaproc_reglualib( L, "string", luaopen_string );
       luaproc_reglualib( L, "math", luaopen_math );
       luaproc_reglualib( L, "debug", luaopen_debug );
     #if (LUA_VERSION_NUM == 502)
       luaproc_reglualib( L, "bit32", luaopen_bit32 );
     #endif
     #if (LUA_VERSION_NUM >= 502)
       luaproc_reglualib( L, "coroutine", luaopen_coroutine );
     #endif
     #if (LUA_VERSION_NUM >= 503)
       luaproc_reglualib( L, "utf8", luaopen_utf8 );
     #endif
     
     }
     
  • 相关阅读:
    数据科学面试应关注的6个要点
    Python3.9的7个特性
    一种超参数优化技术-Hyperopt
    梯度下降算法在机器学习中的工作原理
    MQ(消息队列)功能介绍
    D. The Number of Pairs 数学
    F. Triangular Paths 思维
    D. XOR-gun 思维和 + 前缀
    C. Basic Diplomacy 思维
    D. Playlist 思维
  • 原文地址:https://www.cnblogs.com/youxin/p/4918113.html
Copyright © 2011-2022 走看看