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 , , , ,