lua_push..., lua_pushcclosure, lua_pushfstring, lua_concat, lua_type, lua_is..., lua_to..., lua_gettop, lua_settop, lua_pushvalue, lua_remove, lua_insert, lua_replace, lua_checkstack,
1 lua_push...
void lua_pushboolean (lua_State *L, int b);
void lua_pushnumber (lua_State *L, lua_Number n);
void lua_pushlstring (lua_State *L, const char *s, size_t len);
void lua_pushstring (lua_State *L, const char *s);
void lua_pushnil (lua_State *L);
void lua_pushcfunction (lua_State *L, lua_CFunction f);
void lua_pushlightuserdata (lua_State *L, void *p);
push ½Ã¸®Áî ÇÔ¼öµéÀº µüÈ÷ Ưº°ÇÒ °ÍÀÌ ¾ø´Ù. ±×³É ½ºÅÿ¡´Ù ÇØ´çÇϴ ŸÀÔÀÇ ¾ÆÀÌÅÛÀ» Ǫ½¬ÇÑ´Ù. ·ç¾Æ¿¡¼´Â ¹®ÀÚ¿ÀÌ 0À¸·Î ³¡³ª¾ß¸¸ ÇÏ´Â °ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡ -- ¾î¶² ¹ÙÀ̳ʸ® °ªµµ µÉ ¼ö ÀÖ´Ù -- lua_pushlstring ÇÔ¼ö°¡ Á¸ÀçÇÑ´Ù. ÀϹÝÀûÀÎ C ¹®ÀÚ¿ÀÎ °æ¿ì¿¡´Â ±×³É lua_pushstring ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
2 lua_pushcclosure
void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
C ÇÔ¼ö¿¡´Ù upvalue¸¦ ÇÒ´çÇØ¼ closure¸¦ ¸¸µé±â À§ÇØ »ç¿ëÇÏ´Â ÇÔ¼ö´Ù. upvalue³ª closure¿¡ °üÇÑ °ÍÀº LuaGlossary ÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù. fnÀº C ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀ̰í, nÀº upvalueÀÇ °¹¼ö´Ù. ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ upvalue·Î »ç¿ëÇÒ ¾ÆÀÌÅÛµéÀ» ½ºÅÿ¡´Ù n°³¸¸Å Ǫ½¬ÇØµÖ¾ß ÇÑ´Ù. lua_pushcclosure È£Ãâ ÈÄ¿¡´Â Ǫ½¬Çß´ø ¾ÆÀÌÅÛµéÀÌ ¸ðµÎ ÆËµÇ°í, »ý¼ºµÈ closure°¡ ½ºÅÃÀÇ ¸Ç À§¿¡ Ǫ½¬µÈ´Ù.
È£Ãâ ÀüÀÇ ½ºÅà ȣÃâ ÈÄÀÇ ½ºÅÃ
+---------+ +---------+
| upvalue | | closure |
+---------+ +---------+
| upvalue | | ... |
+---------+ +---------+
| ... | | ... |
+---------+ +---------+
ÀÓÀÇÀÇ C ÇÔ¼ö¸¦ 1°³ÀÇ intÇü upvalue¿Í ÇÔ²² µî·ÏÇϱâ À§Çؼ´Â ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
static int counter(lua_State* L); // ¾îµò°¡¿¡ ¼±¾ðµÇ¾î ÀÖ´Â C ÇÔ¼ö
...
int create_closure(lua_State* L)
{
lua_pushnumber(L, (double)997); // upvalue·Î »ç¿ëÇÒ °ªÀ» ½ºÅÿ¡´Ù Ǫ½¬
lua_pushcclosure(L, &counter, 3); // closure »ý¼º
return 1; // ½ºÅÃÀÇ ¸Ç À§¿¡ closure°¡ 1°³ Ǫ½¬µÇ¾úÀ¸¹Ç·Î...
}
À§ÀÇ ¿¹Á¦¿¡¼ counter ÇÔ¼ö°¡ upvalue¸¦ »ç¿ëÇÏ´Â ÇÔ¼ö¶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. upvalue¸¦ ¾×¼¼½ºÇϱâ À§Çؼ´Â lua_upvalueindex ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
static int counter(lua_State* L)
{
int val = (int)lua_tonumber(L, lua_upvalueindex(1)); // upvalue¸¦ Àоî¿Â´Ù.
lua_pushnumber(L, ++val); // Áõ°¡½ÃŲ °ªÀ» Ǫ½¬ÇÑ´Ù.
lua_pushvalue(L, -1); // ¹æ±Ý Ǫ½¬ÇÑ °ªÀ» º¹»çÇØ¼ ´Ù½Ã Ǫ½¬ÇÑ´Ù.
lua_replace(L, lua_upvalueindex(1)); // º¹»çÇØ¼ Ǫ½¬ÇÑ °ªÀ¸·Î upvalue¸¦ ġȯÇÑ´Ù.
return 1;
}
3 lua_pushfstring
const char* lua_pushfstring(lua_State *L, const char *fmt, ...);
sprintf ÇÔ¼ö¿Í °°ÀÌ Æ÷¸Ë°ú ÀμöµéÀ» ¹Þ¾Æµé¿©, ¹®ÀÚ¿À» »ý¼ºÇÑ ´ÙÀ½, ±× ¹®ÀÚ¿À» ½ºÅÿ¡´Ù Ǫ½¬Çϰí, ±× ¹®ÀÚ¿ÀÇ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù. sprintf ó·³ ´Ù¾çÇÑ Æ÷¸ËÀ» Áö¿øÇÏÁö´Â ¾ÊÀ¸¸ç, ÇöÀç Áö¿øÇÏ´Â Æ÷¸ËÀº %%('%' ¹®ÀÚ¸¦ À§ÇØ), %s(¹®ÀÚ¿), %d(Á¤¼ö), %f(´õºí), %c(ij¸¯ÅÍ) Á¤µµÀÌ´Ù.
4 lua_concat
void lua_concat (lua_State *L, int n);
½ºÅÿ¡¼ n°³¸¸ÅÀÇ ¾ÆÀÌÅÛÀ» ÆËÇØ¼, ±×°ÍÀ» ¸ðµÎ ¹®ÀÚ¿·Î º¯È¯ÇØ ÇÕÄ£ ´ÙÀ½, Ǫ½¬ÇÑ´Ù. ¼ýÀÚ °°Àº °æ¿ì¿¡´Â ÀÚµ¿À¸·Î ¹®ÀÚ¿·Î º¯È¯Çϰí, ´Ù¸¥ ŸÀÔ °°Àº °æ¿ì, ¹®ÀÚ¿·Î º¯È¯Çϱâ À§ÇØ ¸ÞŸ ¸Þ¼µå¸¦ È£ÃâÇϱ⵵ ÇÑ´Ù.
lua_concat(L, 2);
È£Ãâ ÀüÀÇ ½ºÅà ȣÃâ ÈÄÀÇ ½ºÅÃ
+----------+
| "world" |
+----------+ +---------------+
| "hello " | | "hello world" |
+----------+ +---------------+
| ... | | ... |
+----------+ +---------------+
5 lua_type
int lua_type(lua_State *L, int index);
ÁöÁ¤µÈ À§Ä¡ÀÇ ½ºÅÿ¡ ÀÖ´Â ¾ÆÀÌÅÛÀÇ Á¾·ù¸¦ ¹ÝȯÇÑ´Ù. ¹ÝȯÇÏ´Â Á¾·ù´Â lua.h¿¡ ³ª¿ÍÀÖ´Ù. LUA_TNIL, LUA_TBOOLEAN, LUA_TNUMBER, LUA_TSTRING, LUA_TTABLE, LUA_TFUNCTION, LUA_TUSERDATA, LUA_TTHREAD Á¤µµ´Ù.
6 lua_is...
int lua_isnil (lua_State *L, int index);
int lua_isboolean (lua_State *L, int index);
int lua_isnumber (lua_State *L, int index);
int lua_isstring (lua_State *L, int index);
int lua_istable (lua_State *L, int index);
int lua_isfunction (lua_State *L, int index);
int lua_iscfunction (lua_State *L, int index);
int lua_isuserdata (lua_State *L, int index);
int lua_islightuserdata (lua_State *L, int index);
ÁöÁ¤µÈ À§Ä¡ÀÇ ½ºÅÿ¡ ÀÖ´Â ¾ÆÀÌÅÛÀÌ ÇØ´çÇϴ ŸÀÔÀ¸·Î º¯È¯µÉ ¼ö ÀÖ´Â °ªÀΰ¡¸¦ ¹ÝȯÇÏ´Â ÇÔ¼öµéÀÌ´Ù. Áï ¼ýÀÚµéÀÇ °æ¿ì, lua_isnumber ÇÔ¼ö¸¦ ¸¸Á·ÇÒ »Ó¸¸ ¾Æ´Ï¶ó, lua_isstring ÇÔ¼ö ¿ª½Ã ¸¸Á·ÇÑ´Ù. ½ÇÁ¦ ŸÀÔÀ» ¾Ë¾Æ³»±â À§Çؼ´Â lua_type ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.
7 lua_to...
int lua_toboolean (lua_State *L, int index);
lua_Number lua_tonumber (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
size_t lua_strlen (lua_State *L, int index);
lua_CFunction lua_tocfunction (lua_State *L, int index);
void *lua_touserdata (lua_State *L, int index);
lua_State *lua_tothread (lua_State *L, int index);
void *lua_topointer (lua_State *L, int index);
ÁöÁ¤µÈ À§Ä¡ÀÇ ½ºÅÿ¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» ÇØ´çÇϴ ŸÀÔÀ¸·Î º¯È¯Çؼ ¹ÝȯÇÑ´Ù. ÁöÁ¤µÈ À妽ºÀÇ ¾ÆÀÌÅÛÀÌ ÇØ´ç ŸÀÔÀ¸·Î º¯È¯ÀÌ ºÒ°¡´ÉÇÑ Å¸ÀÔÀ̰ųª, À妽º ÀÚü°¡ À߸øµÈ °æ¿ì ¸ðµÎ 0 ¶Ç´Â NULLÀ» ¹ÝȯÇÑ´Ù.
lua_tostring ÇÔ¼öÀÇ °æ¿ì, ¹ÝȯÇÑ ¹®ÀÚ¿ ¾ÆÀÌÅÛÀÌ ½ºÅÿ¡¼ ÆËµÇ´Â °æ¿ì, °¡ºñÁö Ä÷º¼Ç¿¡ ÀÇÇØ ¾ðÁ¦ »ç¶óÁú Áö ¾Ë ¼ö ¾ø´Ù. ±×·¯¹Ç·Î ¹®ÀÚ¿À» °è¼Ó º¸°üÇϱ⸦ ¿øÇÑ´Ù¸é º¹»ç¸¦ ÇØµÎ¾î¾ß ÇÑ´Ù. ·ç¾Æ¿¡¼ ¹®ÀÚ¿Àº ¹Ýµå½Ã 0À¸·Î ³¡³ª´Â °ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡, º¹»ç¸¦ ÇÒ ¶§, ¸ÕÀú lua_strlen ÇÔ¼ö¸¦ ÀÌ¿ëÇØ ±æÀ̸¦ Á¶»çÇØ¾ß ÇÑ´Ù.
8 lua_gettop
int lua_gettop (lua_State *L);
½ºÅÿ¡ µé¾îÀÖ´Â ¾ÆÀÌÅÛµéÀÇ °¹¼ö¸¦ ¹ÝȯÇÑ´Ù. Áï ÀÌ ÇÔ¼ö°¡ ¹ÝȯÇÏ´Â °ªÀº °¡Àå ÃÖ±Ù¿¡ Ǫ½¬µÈ ¾ÆÀÌÅÛÀÇ ½ºÅà À妽º¿Í °°´Ù.
9 lua_settop
void lua_settop (lua_State *L, int index);
½ºÅÃÀÇ Å¾À» ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ 10°³ÀÇ ¾ÆÀÌÅÛµéÀÌ ½ºÅÿ¡ µé¾îÀִµ¥, index °ªÀ» 7·Î Á༠ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϸé, 7°³ÀÇ ¾ÆÀÌÅ۵鸸ÀÌ ³²°í, ³ª¸ÓÁö 3°³´Â ½ºÅÃÀÇ ¸Ç À§¿¡¼ºÎÅÍ ¹ö·ÁÁø´Ù. ¹Ý´ëÀÇ °æ¿ì, Áï 7°³°¡ Àִµ¥ 10À» index·Î ÁØ °æ¿ì, nil °ªÀÌ ¸ðÀÚ¶õ °¹¼ö¸¸Å Ǫ½¬µÈ´Ù. »ç½Ç lua_pop ¸ÅÅ©·Î°¡ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù.
#define lua_pop(L,n) lua_settop(L, -(n)-1);
10 lua_pushvalue
void lua_pushvalue (lua_State *L, int index);
ÇØ´çÇÏ´Â À§Ä¡¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» º¹»çÇØ¼ ½ºÅÃÀÇ ¸Ç À§¿¡´Ù Ǫ½¬ÇÑ´Ù.
lua_pushvalue(L, -1);
È£Ãâ ÀüÀÇ ½ºÅà ȣÃâ ÈÄÀÇ ½ºÅÃ
+---------+
| 999 |
+---------+ +---------+
| 999 | | 999 |
+---------+ +---------+
| 888 | | 888 |
+---------+ +---------+
| ... | | ... |
+---------+ +---------+
11 lua_remove
void lua_remove (lua_State *L, int index);
ÇØ´çÇÏ´Â À§Ä¡¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» ½ºÅÿ¡¼ Á¦°ÅÇÑ´Ù. index À§Ä¡º¸´Ù À§¿¡ ÀÖ´ø ¾ÆÀÌÅÛµéÀº Çϳª¾¿ ³»·Á¿Â´Ù.
lua_remove(L, -2);
È£Ãâ ÀüÀÇ ½ºÅà ȣÃâ ÈÄÀÇ ½ºÅÃ
+---------+
| 999 |
+---------+ +---------+
| 888 | | 999 |
+---------+ +---------+
| 777 | | 777 |
+---------+ +---------+
| ... | | ... |
+---------+ +---------+
12 lua_insert
void lua_insert (lua_State *L, int index);
½ºÅÃÀÇ ¸Ç À§¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» ÁöÁ¤µÈ À§Ä¡·Î ¿Å±ä´Ù. index À§Ä¡º¸´Ù À§¿¡ ÀÖ´ø ¾ÆÀÌÅÛµéÀº Çϳª¾¿ ¿Ã¶ó°£´Ù.
lua_insert(L, -2);
È£Ãâ ÀüÀÇ ½ºÅà ȣÃâ ÈÄÀÇ ½ºÅÃ
+---------+ +---------+
| 999 | | 888 |
+---------+ +---------+
| 888 | | 999 |
+---------+ +---------+
| 777 | | 777 |
+---------+ +---------+
13 lua_replace
void lua_replace (lua_State *L, int index);
½ºÅÃÀÇ ¸Ç À§¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» ÆËÇØ¼ ÁöÁ¤µÈ À§Ä¡¿¡ ÀÖ´Â °ªÀ¸·Î ¼³Á¤ÇÑ´Ù. ¾ÆÀÌÅÛÀÇ À̵¿Àº ¾ø´Ù.
lua_replace(L, -3);
È£Ãâ ÀüÀÇ ½ºÅà ȣÃâ ÈÄÀÇ ½ºÅÃ
+---------+
| 999 |
+---------+ +---------+
| 888 | | 888 |
+---------+ +---------+
| 777 | | 999 |
+---------+ +---------+
14 lua_checkstack
int lua_checkstack (lua_State *L, int extra);
·ç¾ÆÀÇ ½ºÅà ũ±â¸¦ ´Ã¸± ¶§ »ç¿ëÇÏ´Â ÇÔ¼ö´Ù. ·ç¾Æ¿¡¼ C ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °æ¿ì, ·ç¾Æ´Â ½ºÅÿ¡ Àû¾îµµ 20°³ÀÇ ÀÚ¸®¸¦ È®º¸ÇØÁØ´Ù. Áï C ÂÊ¿¡¼ 20°³±îÁö ¾ÆÀÌÅÛÀ» Ǫ½¬ÇÒ ¼ö ÀÖ´Ù´Â ¸»ÀÌ´Ù. ÀϹÝÀûÀÎ °æ¿ì ÀÌ°É·Î ÃæºÐÇÏ´Ù. ±×·¯³ª ÀÌ Å©±â¸¦ ´Ã·Á¾ß ÇÒ ¶§µµ ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϸé, ÇöÀç ½ºÅÿ¡´Ù°¡ extra °¹¼ö¸¸ÅÀÇ ºó ÀÚ¸®¸¦ Ãß°¡ÇÑ´Ù. Âü°í·Î extra ÀμöÀÇ °ªÀ» À½¼ö·Î Á༠½ºÅÃÀÇ Å©±â¸¦ ÁÙÀÌ´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù. ¹«½ÃµÈ´Ù.
¼º°øÀûÀ¸·Î ½ºÅÃÀÇ Å©±â¸¦ ´Ã¸° °æ¿ì¿¡´Â 1À» ¹ÝȯÇϰí, ½ºÅÃÀÇ Å©±â¸¦ ´õ ÀÌ»ó ´Ã¸± ¼ö ¾ø´Â °æ¿ì¿¡´Â 0À» ¹ÝȯÇÑ´Ù. Âü°í·Î ½ºÅÃÀÇ ÃÖ´ë Å©±â´Â LUA_MAXCSTACK °ªÀ¸·Î¼ llimits.h ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Ù. ±âº»°ªÀº 2048ÀÌ´Ù.
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)