天天看點

lua程式設計(第四版)練習答案自做(第三十章)

文章目錄

      • 30.1
      • 30.2
      • 30.3
      • 30.4
      • 30.5
      • 30.6

30.1

#include <stdio.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int filter(lua_State *L)
{
	int index=1;
	luaL_checktype(L,1,LUA_TTABLE);
	luaL_checktype(L,2,LUA_TFUNCTION);
	int len=luaL_len(L,1);
	lua_newtable(L);
	lua_insert(L,3);
	for(int i=1;i<=len;i++)
	{
		lua_pushvalue(L,2);
		lua_geti(L,1,i);
		lua_call(L,1,1);
		if(lua_toboolean(L,-1))
		{
			lua_geti(L,1,i);
			lua_seti(L,3,index++);
			lua_pop(L,1);
		}
		else
			lua_pop(L,1);
	}
	return 1;
}
           

30.2

#include <string.h>
#include <lauxlib.h>
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
static int l_split(lua_State *L)
{
	size_t len;
	int i=1;
	const char *s=lua_tolstring(L,1,&len);
	if(s==NULL)
		return 0;
	const char *sep=luaL_checkstring(L,2);
	char  *e;
	lua_newtable(L);
	while((e=memchr(s,*sep,len))!=NULL)
	{
		lua_pushlstring(L,s,e-s);
		lua_rawseti(L,-2,i++);
		len=len-(e-s+1);
		s=e+1;
	}
	if(len!=0)
	{
		lua_pushlstring(L,s,len);
		lua_rawseti(L,-2,i);
	}
	return 1;
}
           

30.3

#include <string.h>
#include <lauxlib.h>
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
static int l_transliterate(lua_State* L)
{
	int index;
	size_t len;
	luaL_Buffer b;
	luaL_checktype(L,1,LUA_TSTRING);
	luaL_checktype(L,2,LUA_TTABLE);
	const char *str=lua_tolstring(L,1,&len);
	luaL_buffinit(L,&b);
	for(index=0;index<len;index++)
	{
		lua_pushlstring(L,str+index,1);
		switch(lua_gettable(L,2))
		{
			case 1:
				if(lua_toboolean(L,-1))
				{
					lua_pop(L,1);
					lua_pushlstring(L,str+index,1);
					luaL_addvalue(&b);
					break;
				}
				else
				{
					lua_pop(L,1);
					break;
				}
			case 4:
				luaL_addvalue(&b);
				break;
			default:
				lua_pop(L,1);
				lua_pushlstring(L,str+index,1);
				luaL_addvalue(&b);
		}
	}
	luaL_pushresult(&b);
	return 1;
}
           

30.4

#include <string.h>
#include <lauxlib.h>
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
static int l_transliterate(lua_State* L)
{
	int index;
	size_t len;
	luaL_Buffer b;
	lua_getfield(L,LUA_REGISTRYINDEX,"table");
	lua_insert(L,2);
	luaL_checktype(L,1,LUA_TSTRING);
	luaL_checktype(L,2,LUA_TTABLE);
	const char *str=lua_tolstring(L,1,&len);
	luaL_buffinit(L,&b);
	for(index=0;index<len;index++)
	{
		lua_pushlstring(L,str+index,1);
		switch(lua_gettable(L,2))
		{
			case 1:
				if(lua_toboolean(L,-1))
				{
					lua_pop(L,1);
					lua_pushlstring(L,str+index,1);
					luaL_addvalue(&b);
					break;
				}
				else
				{
					lua_pop(L,1);
					break;
				}
			case 4:
				luaL_addvalue(&b);
				break;
			default:
				lua_pop(L,1);
				lua_pushlstring(L,str+index,1);
				luaL_addvalue(&b);
		}
	}
	luaL_pushresult(&b);
	return 1;
}
static int l_settrans(lua_State *L)
{
	luaL_checktype(L,1,LUA_TTABLE);
	lua_pushvalue(L,1);
	lua_setfield(L,LUA_REGISTRYINDEX,"table");
	return 0;
}
static int l_gettrans(lua_State *L)
{
	lua_getfield(L,LUA_REGISTRYINDEX,"table");
	return 1;
}
static const struct luaL_Reg trans[]=
{
	{"transliterate",l_transliterate},
	{"settrans",l_settrans},
	{"gettrans",l_gettrans},
	{NULL,NULL}
};
int luaopen_lib(lua_State *L)
{
	luaL_newlib(L,trans);
	return 1;
}
           

30.5

#include <string.h>
#include <lauxlib.h>
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
static int l_transliterate(lua_State* L)
{
	int index;
	size_t len;
	luaL_Buffer b;
	lua_getfield(L,lua_upvalueindex(1),"table");
	lua_insert(L,2);
	luaL_checktype(L,1,LUA_TSTRING);
	luaL_checktype(L,2,LUA_TTABLE);
	const char *str=lua_tolstring(L,1,&len);
	luaL_buffinit(L,&b);
	for(index=0;index<len;index++)
	{
		lua_pushlstring(L,str+index,1);
		switch(lua_gettable(L,2))
		{
			case 1:
				if(lua_toboolean(L,-1))
				{
					lua_pop(L,1);
					lua_pushlstring(L,str+index,1);
					luaL_addvalue(&b);
					break;
				}
				else
				{
					lua_pop(L,1);
					break;
				}
			case 4:
				luaL_addvalue(&b);
				break;
			default:
				lua_pop(L,1);
				lua_pushlstring(L,str+index,1);
				luaL_addvalue(&b);
		}
	}
	luaL_pushresult(&b);
	return 1;
}
static int l_settrans(lua_State *L)
{
	luaL_checktype(L,1,LUA_TTABLE);
	lua_pushvalue(L,1);
	lua_setfield(L,lua_upvalueindex(1),"table");
	return 0;
}
static int l_gettrans(lua_State *L)
{
	lua_getfield(L,lua_upvalueindex(1),"table");
	return 1;
}
static const struct luaL_Reg trans[]=
{
	{"transliterate",l_transliterate},
	{"settrans",l_settrans},
	{"gettrans",l_gettrans},
	{NULL,NULL}
};
int luaopen_lib(lua_State *L)
{
	luaL_newlibtable(L,trans);
	lua_newtable(L);
	luaL_setfuncs(L,trans,1);
	return 1;
}
           

30.6

私以為失去了靈活性。