Lua相关问题整理(4) – 让Lua的eval函数支持赋值语句

上一篇文章提到了在Lua中实现类似于JavaScript中的eval函数,遗憾是该eval函数不支持赋值语句,原因是Lua的赋值运算符是不支持返回值。所以如果要让该eval函数也支持赋值语句,就需要一个额外的工作,让它鉴别一个语句是不是赋值语句,如果是,则return的是被赋值后变量的值。为此,我写了一个isAssignmentExpression函数,比较粗糙,不过够用了,基本思想是检测语句中第一个出现的”=“操作符,且该”=“不能在一对引号当中。 — Lua code function isAssignmentExpression( str ) local i = 1; local curChar; local quotesType = "none" — none, single or double local isEscaping = false curChar = string.sub( str, 1, 1 ) while ( curChar ~= "" ) do if ( curChar == "’" and isEscaping == false and quotesType ~= "double" ) [...]

Posted in: Lua by Benny Chen 9 Comments , ,

Lua相关问题整理(3)

在注册给Lua的C函数中为Lua提供默认参数 使用luaL_optstring, luaL_optnumber, luaL_optinteger等Lua API,如下示例,函数有一个默认字符串参数,默认值为””,这样在Lua中调用whatever的时候,whatever()或者whatever( “whatever”)均可。(Oh…whatever…随便…都行…) // C code int Whatever( lua_State *L ) { string str = luaL_optstring( L, 1, "" ); //…omitted code… } lua_register( L, "whatever", Whatever ); 建立Lua字符串到C enum的映射 使用luaL_checkoption这个Lua API,它可以把从Lua传来的string转换为相应的C string array中的index,从而可以建立Lua字符串和C enum的映射。以下是个简单的示例: // C code enum PlayerType { PLAYER_TYPE_UNDEFINED = -1, PLAYER_TYPE_KING = 0, // 主公 PLAYER_TYPE_INSURGENT, // 反贼 [...]

Posted in: Lua by Benny Chen No Comments , , , ,

Lua相关问题整理(2) – 如何在C中为Lua提供同步调用接口

这个问题的具体描述是——C注册给Lua一个函数,但Lua调用该C函数并不能立即获得结果(比如需要访问远程服务器获取值),如何能让Lua停止并等待,直到获取到结果后,才继续执行接下来的脚本。 举个例子,比如说有一个C函数login,我们试图通过调用该函数以执行用户的登录操作并获取验证结果。首先看下面这段C代码: // C code int login( lua_State *L ) { string user = luaL_checkstring( L, 1 ); string password = luaL_checkstring( L, 2 ); // 该函数将user和password发送到服务器后立即返回, // 绝不要在此处阻塞,这将严重影响效率 sendAuthenticationInfo( user, password ); return 0; } // 注册给Lua lua_register( L, "login", login ); 可以看到,因为该函数需要访问远程的登录服务器,在系统中一般都采取异步操作(让系统阻塞等待结果是不可接受的)。但是这样Lua开发人员调用login函数时,也只能异步等待结果,下面是Lua中处理登录操作的代码。 — Lua code — 当用户点击“登陆”按钮后,执行该函数 function onClickLoginBtn() local user = … [...]

Lua相关问题整理(1)

(Under Linux)cannot find ‘dlsym’ ‘dlopen’ ‘dlerror’ ‘dlclose’ 需要同时链接”dl“库 (Under Linux)编译lua报错luaconf.h:275:31: error: readline/readline.h: No such file or directory 需要下载并安装GNU Readline Library PANIC: unprotected error in call to Lua API (unable to get ModuleFileName) 1: 不推荐的解决方式:将Project Properties->Configuration Properties->General下的Character Set从unicode改成multi-set; 2: 彻底的解决方式,参考此链接:http://lua-users.org/lists/lua-l/2006-06/msg00427.html 如何将Lua文本文件转化为Lua块文件(chunk file) 调用LuaAPI – lua_dump 关于lua_dump: about lua_dump: Dumps a function as a binary chunk. Receives [...]