์ง๊ฐ์๋ ์๋ฌด๋ ์๋์ง ์์ 24์๊ฐ์ด ๊ฐ๋ ์ฐจ ์๋ค. -- ์๋๋ ๋ฒ ๋ท
๏ปฟ
Contents
- 1 ์์๊ธ
- 2 ๋ฃจ์ ์ธ์ด์ ๊ตฌํ
- 3 Table
- 4 ์ฌ์ฉ์ ์ ์๋ ์์ฑ์(Constructor)
- 5 ๊ฐ์ฒด์งํฅ์ ํ๋ก๊ทธ๋๋ฐ
- 6 Fallbacks
- 7 Fallback์ ํตํ ์์
- 8 ์ฌ๊ท(Reflexive) ๊ธฐ๋ฅ
- 9 ๋ฃจ์๋ก Tk๋ฅผ ๋ฐ์ธ๋ฉ ํ๊ธฐ
- 10 Tk/Lua ์์ ฏ์ ์์ฑํ๊ธฐ
- 11 ์์ ฏ ๋ช ๋ น๋ค์ ์ต์ธ์คํ๊ธฐ
- 12 Behind the Scenes
- 13 ๊ฒฐ๋ก
- ์๋ฌธ ๋งํฌ :
http://www.lua.org/ddj.html
- ์ ์ : Luiz Henrique de Figueiredo, Roberto Ierusalimschy, Waldemar Celes
1 ์์๊ธ #
์๊ทผ๋ ์ดํ๋ฆฌ์ผ์ด์
์ ํ์ฅํ๊ณ ์์ ํ๊ธฐ ์ํ ์ฌ๋ฌ๊ฐ์ ์ํ ์ธ์ด๋ค์ด ์ ์๋์ด์ ธ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฐ ํ์ฅ ์ธ์ด๋ค์ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
- ๋ช ๋ฐฑํ๊ณ ๊ฐ๋จํ ๋ฌธ๋ฒ (์ด๋ฐ ์ธ์ด์ ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ค์๊ฒ๋ ์ฃผ๋ ฅ ์ธ์ด๊ฐ ์๋๊ธฐ๋๋ฌธ์ด๋ค)
- ์์ ํฌ๊ธฐ์ ์ฌ์ด ๊ตฌํ (๊ณ ๋ก ์๋ ํ๋ก๊ทธ๋จ์ ์ถ๊ฐํ๋ ๋น์ฉ์ด ๊ทธ๋ ๊ฒ ๋์ง ์๋ค)
- ์ข์ ๋ฐ์ดํ ๋ฌ์ฌ ๊ธฐ๋ฅ (์ค์ ์ธ์ด๋ก์จ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค)
- ์๋ง์ ํ์ฅ์ฑ (๋์ ์ถ์ํ ๋ ๋ฒจ์์์ ์ฌ์ฉ๊ฐ๋ฅํ ๊ฒ - ๋ค๋ฅธ ๋ถ์ผ์ ์ฌ์ฉ์๋ค๋ ์ฌ์ฉํ ์ ์๊ฒ ํ๊ธฐ ์ํจ)
์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ฐํํ๋ ๋ฃจ์(LUA) - ํ์ฅ๊ฐ๋ฅํ ์๋ฒ ๋๋์ฉ ์ธ์ด - ๋ ๋ค์๊ณผ ๊ฐ์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋ค. ์ด ์ธ์ด์ ๋ฌธ๋ฒ๊ณผ ์ ์ด๊ตฌ์กฐ๋ค์ ๊ฐ๋จํ๊ณ ์ต์ํ ๊ตฌ์กฐ์ด๋ค. ๋ฃจ์๋ ์๋ค - ๊ตฌํ๋ ์ ์ฒด์ ํฌ๊ธฐ๋ ANSI C์ฝ๋๋ก 6์ฒ์ค์ด ์ฑ ๋์ง์๋๋ค. ๋๋ถ๋ถ์ ์ ์ฐจ์ ์ธ ์ธ์ด์ ์ผ๋ฐ์ ์ผ๋ก ์กด์ฌํ๋ ๊ธฐ๋ฅ๋ค์ธ์๋, ๋ฃจ์๋ฅผ ๊ฐ๋ ฅํ ์์๋ ๋ฒจ ํ์ฅ๊ฐ๋ฅํ ์ธ์ด๋ก ๋ง๋ค์ด ์ฃผ๋ ํน๋ณํ ํน์ง๋ค์ ๊ฐ์ง๊ณ ์๋ค.
- first-class ๊ฐ์ผ๋ก์จ ํจ์๋ค์ ์ ์ํ๊ณ ๊ด๋ฆฌํ๋ ๋ฅ๋ ฅ. ์ด๊ฒ์ ๊ฐ์ฒด์งํฅ์ ์ธ ๊ธฐ๋ฅ๋ค์ ๊ตฌํ์ ์์ฒญ๋๊ฒ ๋จ์ํ๊ฒ ํด์ค๋ค.
- ๊ฒฐํฉํ๊ธฐ ์ฌ์ด ๋ฐฐ์ด(Associative array) - ๋๋ถ๋ถ์ ๋ฐ์ดํ ์ปจํ ์ด๋๋ฅผ ๊ตฌํํ๋ ๊ฐ๋ ฅํ ์ธ์ด ๊ฐ๋ ์ด๋ค.
- Garbage collection. ๋ฉ๋ชจ๋ฆฌ ํ ๋น - ํ๋ก๊ทธ๋จ ์๋ฌ๋ค์ ์ฃผ๋ ์์ธ - ์ ๋ํ ๋ช ํํ ๊ด๋ฆฌ์ ํ์๋ฅผ ์์ ์ค๋ค.
- ๋์ฒด ์์คํ (fallback) ๊ตฌ์กฐ. ์ธ์ด์ ๋ฌธ๋ฒ๊ตฌ์กฐ์ ํ์ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- ์ฌ๊ท(Reflexive) ๊ธฐ๋ฅ. ๋์ ๋คํ์ ์ธ ๋ถ๋ถ์ ์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
http://www.lua.org ๋ฐฐํฌ๋ณธ์ ๋ํ ์ํ(sin, cos๋ฑ๋ฑ), ์
์ถ๋ ฅ, ๋ฌธ์์ด ๊ด๋ฆฌํจ์๋ค์ ๋ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๊ณ ์๋ค. ์ด ๋ถ๊ฐ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์์คํ
์ 1์ฒ์ค๊ฐ๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค. ๋ํ (๋ฐฐํฌ๋ณธ์) ๋๋ฒ๊ฑฐ์ ๋ฐ์ดํธ์ฝ๋๋ค์ ๋ด๊ณ ์๋ ์ด์๊ฐ๋ฅํ ์ด์งํ์ผ๋ค์ ์์ฑํ ์ ์๋ ๋ณ๋์ ์ปดํ์ผ๋ฌ๋ฅผ ํฌํจํ๊ณ ์๋ค. ์ฝ๋๋ ๋๋ถ๋ถ์ ANSI C ์ปดํ์ผ๋ฌ์์ ์์ ์์ด ์ปดํ์ผ๋๋ค. gcc(AIX, IRIX, Linux, Solaris, SunOS, ULTRIX), Turbo C (DOS), Visual C++ (Windows 3.1/95/NT), Think C (MacOS), CodeWarrior (MacOS)๋ค์ด ๋ํ์ ์ธ ์ฌ์ฉ๊ฐ๋ฅํ ์ปดํ์ผ๋ฌ๋ค์ด๋ค.
ํ๋ก๊ทธ๋จ๊ณผ์ ๋งํฌ์ ์ถฉ๋์ ํผํ๊ธฐ ์ํด ๋ชจ๋ ์ธ๋ถ ์๋ณ์(ํจ์, ๋ณ์๋ฑ๋ฑ)๋ค์ 'lua'๋ฅผ ์ ๋์ด๋ก์จ ๋ถ์ธ๋ค. yacc๋ฅผ ์ฌ์ฉํด ์์ฑ์ํจ ์ฝ๋ ์กฐ์ฐจ๋ ์ด ์กฐ๊ฑด์ ๋ง์ถ๊ธฐ ์ํด sed ํํฐ๋ฅผ ํตํด ํต๊ณผ์ํจ๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก yacc๋ฅผ ์ฌ์ฉํ ํ๋ก๊ทธ๋จ๊ณผ๋ ๋ฃจ์๋ฅผ ๋งํฌ์ํฌ ์ ์๋ค.
2 ๋ฃจ์ ์ธ์ด์ ๊ตฌํ #
๋ฃจ์๋ ์ฃผ ์ดํ๋ฆฌ์ผ์ด์
๊ณผ ๋งํฌ๋๊ธฐ์ํ C ํจ์๋ค์ ์กฐ๊ทธ๋งํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์จ ์ ๊ณต๋๋ค. ์๋ฅผ ๋ค์๋ฉด, ๊ฐ์ฅ ์์ ๋ฃจ์ ํด๋ผ์ด์ธํธ๋ ์๋ ์์ค์ ๊ฐ์ ๋ํํ์ ๋
๋ฆฝ์ ์ธ ์ธํฐํ๋ฆฌํฐ๋ผ๊ณ ํ ์ ์๋ค.
#include "lua.h"
int main()
{
char line[BUFSIZ];
while (fgets(line,sizeof(line),stdin)!=0)
lua_dostring(line);
return 0;
}
์ด ํ๋ก๊ทธ๋จ์์ ํจ์ lua_dostring์ ๋ฌธ์์ด์ ๋ด๊ฒจ์๋ ์ฝ๋๋ฅผ ์ธํฐํ๋ฆฌํฐ์ ๋๊ธด๋ค. ๋ฃจ์ ์ฝ๋์ ๊ฐ ๋ถ๋ถ์ ํจ์์ ์ ์๋ค๊ณผ ๋ฌธ์ฅ๋ค์ ๋ด๊ณ ์์ ๊ฒ์ด๋ค.
lua.h๋ ๋ฃจ์์ API๋ฅผ ์ ์ํ๋ฉฐ, 30๊ฐ๊ฐ๋์ ํจ์๋ค์ ๊ฐ์ง๊ณ ์๋ค. lua_dostring์ธ์๋ ๋ฃจ์์ฝ๋๊ฐ ๋ด๊ธด ํ์ผ๋ก๋ถํฐ ์ธํฐํ๋ฆฌํ
ํ๊ธฐ์ํ lua_dofile์ด ์๊ณ , ๋ฃจ์์ ์ ์ญ ๋ณ์๋ค์ ๊ด๋ฆฌํ๊ธฐ์ํ lua_getglobal์ lua_setglobal๊ฐ ์์ผ๋ฉฐ, lua_call์ ๋ฃจ์ ํจ์๋ค์ ํธ์ถํ ์ ์๊ฒ ํด์ค๋ค. lua_register๋ ๋ฃจ์๋ก๋ถํฐ C ํจ์๋ค์ ์ต์ธ์ค๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ค๋ค. ๊ทธ์ธ ๊ธฐํ๋ฑ๋ฑ์ด ์์ง๋ง ์๋ตํ๋ค.
๋ฃจ์๋ ๋ค์ Pascal๊ณผ ๋น์ทํ ๋ฌธ๋ฒ์ ๊ฐ์ง๊ณ ์๋ค. else๋ค๋ก ํ์ฌ๊ธ ๋งค๋ฌ๋ฆฌ๊ฒ ๋๋ ๊ฒ์ ํผํ๊ธฐ ์ํด if๋ while๋ฌธ๊ณผ ๊ฐ์ ์ ์ด ๊ตฌ์กฐ๋ค์ ๋ช
๋ฐฑํ end๋ก ๋๋๋ค.์ฃผ์์ Ada์์ ์ฌ์ฉํ ๋ฌธ๋ฒ์ ๋ฐ๋ฅธ๋ค - "--"๋ก ์์ํ๋ฉฐ ๊ทธ ํจ๊ณผ๋ ์ค์ ๋๊น์ง ์ง์๋๋ค. ๋ฃจ์๋ ๋ค์ค ๋์
๋ฌธ์ ์ง์ํ๋ค. ์๋ฅผ ๋ค์๋ฉด, x, y = y, x์ x์ y์ ๊ฐ์ ๋ฐ๊พผ๋ค. ๋์ฑ์ด, ํจ์๋ค์ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ๋ฐํํ ์ ์๋ค.
๋ฃจ์๋ ๋์ ์ผ๋ก ํ์
์ด ์ง์ ๋๋ ์ธ์ด์ด๋ค. ์ด๊ฒ์ ๊ฐ์ ํ์
์ ๊ฐ์ง๊ณ ์์ง๋ง ๋ณ์๋ ๊ทธ๋ ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋์ ๋ณ์๋ ํ์
์ ๋ํ ์ ์ธ์ด ์๋ค.๋ด๋ถ์ ์ผ๋ก ๊ฐ ๊ฐ์ ๊ทธ๊ฒ์ ํ์
์ ์๋ณํ๊ธฐ์ํ ํ๊ทธ๋ฅผ ๊ฐ์ง๋ค, ํ๊ทธ๋ ๋ด์ฅ๋ ํจ์ํ์
๊ณผ ํจ๊ป ์คํ์์ ์ง์๋ ์ ์๋ค.(?) ๋ณ์๋ค์ ํ์
์ด ์์ผ๋ฉฐ ์ด๋ค ํ์
์ ๊ฐ๋ ๋ด์ ์ ์๋ค. ๋ฃจ์์ garbage collection์ ๊ฐ๋ค์ด ์ฌ์ฉ๋๊ณ ์๋์ง๋ฅผ ์ถ์ ํ๋ฉฐ, ์ฌ์ฉํ๊ณ ์์ง ์๋ค๊ณ ํ๋จ๋๋ฉด ํด์ ์ํจ๋ค.
๋ฃจ์๋ nil, string), number, user data, ํจ์, ๊ทธ๋ฆฌ๊ณ ํ
์ด๋ธ ํ์
๋ค์ ์ ๊ณตํ๋ค. nil์ nil๊ฐ์ ๋ํ ํ์
์ด๋ค - ์ด๊ฒ์ ์ฃผ๋ ํน์ฑ์ ์ด๋ค ๋ค๋ฅธ ๊ฐ๊ณผ๋ ๋ค๋ฅด๋ค๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์๋ฉด ์ด๊ฒ์ ๋ณ์์ ์ด๊ธฐํ ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ข๋ค. numberํ์
์ ๋ถ๋์์์ ์ค์๋ค์ ๋ํํ๋ค. string์ ๋ฌธ์์ด์ ๋ํํ๋ค. user data ํ์
์ C์์ void* ํฌ์ธํฐ๋ฅผ ์ฐ์ํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฃจ์ ์์์ ์ฃผ ๊ฐ์ฒด๋ค์ ๋ํํ๋ค. ๋ชจ๋ ํ์
๋ค์ด ์ ์ฉํ์ง๋ง, ๋ฃจ์์ ์ ์ฐ์ฑ์ function๋ค๊ณผ table๋ค์์ ๊ธฐ์ธํ๋ค. ์ด๊ฒ์ Lisp์ Scheme์ธ์ด๋ก๋ถํฐ์ ๋ค์๊ณผ ๊ฐ์ ๋๊ฐ์ง์ ํต์ฌ์ ์ธ ๊ตํ์ ์ฐ๋ฌผ์ด๋ค.
- Function(ํจ์)๋ค์ first-class ๊ฐ์ด ๋์ด์ผ๋ง ํ๋ค.
- ์ธ์ด๋ ๋จ ํ๋์, ๊ฐ๋ ฅํ๊ฒ ํตํฉ๋ ๋ฐ์ดํ ์์ฑ์๋ฅผ ๊ฐ์ ธ์ผ๋ง ํ๋ค. (Lisp์์ list, ๋ฃจ์์์๋ table)
๋ฃจ์์์ ํจ์๊ฐ ์ ์ธ๋ ๋ (์๋ ์์ ๋ฅผ ๋ด๋ผ), ํจ์ ๋ณธ์ฒด๋ ๋ฐ์ดํธ์ฝ๋๋ค๋ก ๊ธฐ์ปดํ์ผ๋๋ฉฐ, function ๊ฐ์ ์์ฑํ๋ค. ์ด ๊ฐ์ ์ฃผ์ด์ง ์ด๋ฆ์ ์ ์ญ๋ณ์๋ก ์ ์ฉ๋๋ค. ๋ฐ๋ฉด์ C ํจ์๋ค์ ์๋ง์ API์ ํธ์ถ์ ์ํด ํธ์คํธ ํ๋ก๊ทธ๋จ์ ์ํด ์ ๊ณต๋๋ค. ๋ฃจ์๋ ํธ์คํธ ํ๋ก๊ทธ๋จ์ ์ํด ๋ฑ๋ก๋์ด์์ง ์์ C ํจ์๋ ํธ์ถํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ํธ์คํธ ํ๋ก๊ทธ๋จ์ ๋ฃจ์ ํ๋ก๊ทธ๋จ์ด ๋ฌด์์ ํ ์ ์๋์ง - ์ด์์ฒด๊ณ์ ๋ํ ์ด๋ค ์ ์ฌ์ ์ผ๋ก ์ํํ ์ ๊ทผ์ ํฌํจํ - ์ ๋ํ ์์ ํ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์๋ค.
function map(list, func)
local newlist = {}
local i = 1
while list[i] do
newlist[i] = func(list[i])
i = i+1
end
return newlist
end
3 Table #
๋ฃจ์์์ Table์ Lisp์์์ list์ ํด๋นํ๋ค : ์ด๊ฒ๋ค์ ๊ฐ๋ ฅํ ์๋ฃ๊ตฌ์กฐ ์ฒด๊ณ๋ก์จ ์ฌ์ฉ๋๋ค. ๋ฃจ์์ Table์ ๊ฒฐํฉ๋ ๋ฐฐ์ด(associative array)๊ณผ ์ ์ฌํ๋ค. Associative array๋ค์ ๋จ์ง number๋ฅผ ์ ์ธํ ์ด๋ค ํ์
์ ๊ฐ์ผ๋ก๋ ์ธ๋ฑ์ค๋ ์ ์๋ค.
Associative array๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๊ฒ ๋๋ฉด ๋ง์ ์๊ณ ๋ฆฌ์ฆ๋ค์ด ํ์ฐฎ๊ฒ ๋์ด๋ฒ๋ฆฐ๋ค. ์๋๋ฉด ๊ฒ์์ ์ํ ์๋ฃ๊ตฌ์กฐ๋ ์๊ณ ๋ฆฌ์ฆ๋ค์ด ์ธ์ด์์ํด ๋ช
์์ ์ผ๋ก ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฃจ์๋ Associative array๋ฅผ ํด์ฌ ํ
์ด๋ธ๋ก์จ ๊ตฌํํ๋ค.
Associative array๋ฅผ ๊ตฌํํ๊ณ ์๋ ๋ค๋ฅธ ์ธ์ด๋ค๊ณผ๋ ๋ฌ๋ฆฌ ๋ฃจ์์์์ Table์ ๋ณ์๋ช
์ ๋งค์ฌ์์ง ์๋ค. ๋์ , Table๋ค์ ์ผ๋ฐ์ ์ธ ์ธ์ด๋ค์์์์ ํฌ์ธํฐ์ ๊ฐ์ด ๋ค๋ฃจ์ด์ง ์ ์๋ ๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๋ค์ด๋ค. ๋ค๋ฅด๊ฒ ๋งํ๋ฉด, Table์ ๊ฐ์ฒด์ด์ง ๊ฐ์ด ์๋๋ค. ๋ณ์๋ค์ Table์ ๋ด์ ์ ์์ผ๋ฉฐ, ๋จ์ง ๊ทธ๊ฒ๋ค์ ์ฐธ์กฐํ ๋ฟ์ด๋ค. ๋์
, ์ธ์ ์ ๋ฌ, ํจ์ ๋ฐํ๊ฐ๋ค์ ์ธ์ ๋ ์ฌ์ฉ๋๊ธฐ ์ ์ ์์ฑ๋๋ฉฐ, ๊ทธ๊ฒ์ ๋ํ Table์ด ์์ ๋กญ๊ฒ ๋ค๋ฅธ Table์ ์ฐธ์กฐํ๋ ๊ฒ์ ํ๋ฝํ๋ค. ๊ทธ๋์, ๋ฃจ์์ Table์ ์ฌ๊ท์ ์ธ ๋ฐ์ดํ ํ์
๋ค์ ๋ํ๋ด๊ฑฐ๋, ์ผ๋ฐ์ ์ธ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๊ฑฐ๋, ์ฌ์ง์ด ์ํ(cycle)๊ณผ๋ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์๋ค.
Table์ ์ธ๋ฑ์ค๋ก์จ ํ๋๋ช
์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋จํ Record๋ฅผ ์๋ฎฌ๋ ์ด์
ํ ์ ์๋ค. ๋ฃจ์๋ a["name"]์ ๋ํ ๋๋ค๋ฅธ ๋ฌธ๋ฒ์ ์ธ ํํ์ผ๋ก์จ a.name์ ์ ๊ณตํจ์ผ๋ก์จ ์ด๋ฐ ์์
์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค. Set(์งํฉ)์ ๊ทธ ์์๋ค์ Table์ ์ธ๋ฑ์ค๋ก์จ ์ ์ฅํจ์ผ๋ก์จ ์ฝ๊ฒ ๊ตฌํ๋ ์ ์๋ค. Table(๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก Set๋)์ homogeneousํ ํ์๊ฐ ์๋ค : ๊ทธ๊ฒ๋ค์ ๋์์ ๋ชจ๋ ํ์
์ - Function๊ณผ Table์ ํฌํจํ - ๊ฐ๋ค์ ์ ์ฅํ ์ ์๋ค.
๋ฃจ์๋ Table์ ์์ฑํ๊ธฐ ์ํ ํน๋ณํ ์ข
๋ฅ์ ํํ์ผ๋ก์จ ์์ฑ์(constructor)๋ฅผ ์ ๊ณตํ๋ค. ์ด๊ฒ์ list, array, record๋ค์ ์ด๊ธฐํํ๋ ๊ฒ์ ์์ฝ๊ฒ ํด์ค๋ค. ์๋ ์์ ๋ฅผ ๋ด๋ผ. (a)์ ์๋ ํ
์ด๋ธ ์ ์ธ์ (b)์ ๋์ผํ๋ค.
(a)
t = {} -- ๋น table
t[1] = i
t[2] = i*2
t[3] = i*3
t[4] = i+j
s = {}
s.a = x -- s["a"] = x ๊ณผ ๊ฐ์ ํํ.
s.b = y
(b)
t = {i, i*2, i*3, i+j}
s = {a=x, b=y}
4 ์ฌ์ฉ์ ์ ์๋ ์์ฑ์(Constructor) #
Sometimes you need finer control over the data structures you are building.
๋๋๋ก ์ฌ๋ฌ๋ถ์ด ๊ตฌ์ถํ๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ๋ค ์์ ๋ ์ข์ ์ ์ด๋ฅผ ํ์๋ก ํ ๋๊ฐ ์๋ค. ์กฐ๊ธ๋ง ์ผ๋ฐ์ ์ธ ๋ฉํ ๊ตฌ์กฐ๋ค์ ์ ๊ณตํ๋ค๋ ์ฒ ํ์ ๋ฐ๋ผ,๋ฃจ์๋ ์ฌ์ฉ์ ์ ์ ์์ฑ์(Constructor)๋ฅผ ์ ๊ณตํ๋ค. ์ด ์์ฑ์๋ ์์ฑ์๋ช
{...} ๋ก ์ฐ์ฌ์ง๋ฉฐ, ๋ณด๋ค ์ง๊ด์ ์ธ ํํ์ ์์ฑ์๋ช
({...})์ผ๋ก ์ธ ์ ์๋ค. ๋ค๋ฅธ ๋ง๋ก ํ์๋ฉด, ์ด๋ฐ ์์ฑ์์ ํํ๋ก์จ, Table์ด ์์ฑ๋๊ณ , ์ด๊ธฐํ๋๋ฉฐ, ํจ์์ ์ธ์๋ก์จ ์ ๋ฌ๋๋ค. ์ด ํจ์๋ ์ด๊ธฐํ๊ฐ ํ์ํ ๋๋ ์ธ์ ๋ ์ด๊ธฐํํ ์ ์์ผ๋ฉฐ ํธ์คํธ ํ๋ก๊ทธ๋จ์์๋ ์ด๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ ๋์ ํ์
๊ฒ์ฌ๋, ๋น ์ง ํ๋์ ์ด๊ธฐํ, ๋ณด์กฐ(auxiliary) ์๋ฃ๊ตฌ์กฐ์ ๊ฐฑ์ ์ด ๋ ์ ์๋ค.
์ฌ์ฉ์ ์ ์๋ ์์ฑ์๋ ๊ณ ๋ ๋ฒจ์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋๋ฐ ์ฌ์ฉ๋ ์ ์๋ค. ๊ณ ๋ก, ์๋ง์ ์ ์๋ฅผ ๊ฐ์ง ํ๊ฒฝํ์์ ์ฌ๋ฌ๋ถ์ window1=Window{x=200, y=300, color="blue"} ์ ์ ์ํ๊ณ ๋ ํ๋ฒํ Table์ด ์๋ "์๋์ฐ"๋ก์จ ๊ฐ์ฃผํ ์ ์๋ค. ๊ฒ๋ค๊ฐ, ์์ฑ์๋ค์ด expression์ด๊ธฐ ๋๋ฌธ์ ์์ฑ์๋ค์ ์ข๋ ๋ณต์กํ ๊ตฌ์กฐ๋ค์ ์ ์ธ์ ์ธ ์คํ์ผ ๋ด์ ํํํ๊ธฐ์ํด ๋ด์ฅ๋ (nested) ์ ์๋ค. ์๋ ์์ ๋ฅผ ๋ณด๋ผ.
S = Separator{
drawStyle = DrawStyle{style = FILLED},
material = Material{
ambientColor = {0.377, 0.377, 0.377},
diffuseColor = {0.800, 0.771, 0.093},
emissiveColor = {0.102, 0.102, 0.102},
specularColor = {0.0, 0.0, 0.0}
},
transform = Transform{
translation = {64.293, 20.206, 0.0},
rotation = {0.0, 0.0, 0.0, 0.0}
},
shape = Sphere{radius = 10.0}
}
5 ๊ฐ์ฒด์งํฅ์ ํ๋ก๊ทธ๋๋ฐ #
ํจ์๊ฐ First-Class ๊ฐ์ด๊ธฐ ๋๋ฌธ์, Table ํ๋๋ค์ ํจ์๋ค์ ์ฐธ์กฐํ ์ ์๋ค. ์ด๊ฒ์ ๊ฐ์ฒด์งํฅ์ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํ๋์ ๋จ๊ณ์ด๊ณ , ๋ฉ์๋์ ์ ์์ ํธ์ถ์ ํ๊ธฐ์ํ ๋์ฑ ๋จ์ํ ๋ฌธ๋ฒ์ ์ํด ๋ ๊ฐ๋จํ ๋ง๋ค์ ์๋ค.
๋ฉ์๋ ์ ์๋ ์๋ ์์ ์ (a)์ ๊ฐ์ด ์ฐ์ฌ์ง ์ ์์ผ๋ฉฐ, ์ด๊ฒ์ ์๋ ์์ ์ (b)์ ๊ฐ๋ค. ๋ค๋ฅธ ๋ง๋ก ํ์๋ฉด ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฒ์ self๋ผ๊ณ ๋ถ๋ฆฌ๋ ์จ๊ฒจ์ง ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ๊ฐ์ง ํจ์๋ฅผ ์ ์ํ๊ณ Table ํ๋์ ํจ์๋ฅผ ์ ์ฅํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
(a)
function object:method(params)
...
end
(b)
function object.method(self, params)
...
end
๋ฉ์๋ ํธ์ถ์ ํธ์ถ๊ฐ์ฒด๋ช
:๋ฉ์๋๋ช
(์ธ์๋ค)์ผ๋ก ๊ธฐ์ ๋๋ฉฐ, ์ด๊ฒ์ ํธ์ถ๊ฐ์ฒด๋ช
.๋ฉ์๋๋ช
(ํธ์ถ๊ฐ์ฒด๋ช
,์ธ์๋ค)๋ก ๋ฒ์ญ๋๋ค. ์ธ์ self์ ์ด๋ฆ์์ ์ถ์ธกํ ์ ์๋ฏ์ด ๋ฉ์๋์ ํธ์ถ๊ฐ์ฒด๋ช
์ด ๋ฉ์๋์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋๋ค.
์ด๋ฐ ํํ์ ์์ฑ์ ์ ๋ณด์ํ๋ฅผ ์ง์ํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์์ํ๋ค์ (์ ํํ๊ฒ๋) ๊ฐ์ฒด์งํฅ์ ์ค์ํ ๋ถ๋ถ์ ๋นผ๋จน์๋ค๊ณ ์ฃผ์ฅํ ์๋ ์๋ค. ๊ฒ๋ค๊ฐ, ๋ฃจ์๋ ํด๋์ค๋ฅผ ์ ๊ณตํ์ง ์๋๋ค. ๊ฐ ๊ฐ์ฒด๋ ๊ทธ ์์ ์ ๋งค์๋์ฒ๋ฆฌ๋ ํ
์ด๋ธ์ ์๋ฐํ๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ด๋ฐ ํํ์ ์์ฑ์ ๊ทนํ ๊ฐ๋ณ๊ณ ์์(ํ๋กํ ํ์
๊ธฐ๋ฐ์ ์ธ์ด๋ค์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ง์๋๋ค. Self๋ฅผ ์๊ฐํ๋ฉด ๋๋ค)์ ์ฌ์ฉํ๋ฉด ํด๋์ค๋ค์ ์๋ฎฌ๋ ์ดํธ ๋ ์ ์๋ค.
6 Fallbacks #
๋ฃจ์๊ฐ ํ์
์ด ์๋ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ๋น์ ์์ ์ธ ์ค์๊ฐ ์ด๋ฒคํธ๋ค์ด ๋ฐ์ํ ์ ์๋ค. : ์ฐ์ ์ฐ์ฐ๋ค์ด ๋น์ฐ์ ์ ์ธ ์ฐ์ฐ์์ ์ ์ฉ๋ ์ ์์ผ๋ฉฐ, table์ด ์๋ ๊ฐ์ด ์ธ๋ฑ์ฑ๋๊ณ , function ๊ฐ์ด ์๋๋ฐ๋ ํธ์ถ๋ ์ ์๋ค.
ํ์
์ด ์กด์ฌํ๋ ๋
๋ฆฝ์ ์ธ ์ธ์ด๋ค์ ์ปดํ์ผ๋ฌ์ ์ํด ์ด๋ฐ ์ํ๋ค์ค ๋ช๊ฐ์ง๋ค์ด ํ์๋๋ค. : ๋ค๋ฅธ ๊ฒ๋ค์ ์ค์๊ฐ์ ํ๋ก๊ทธ๋จ ์คํ์ด ์ทจ์๋๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค. ํธ์คํธ ํ๋ก๊ทธ๋จ์ ์คํ์ ์ทจ์ํ๋ ๊ฒ์ ์๋ฒ ๋๋ ์ธ์ด๋ก์จ๋ ๋ฌด๋กํ ์ง์ด๋ฏ๋ก ์๋ฒ ๋๋ ์ธ์ด๋ ํต์์ ์ผ๋ก ์๋ฌ ํธ๋ค๋ง์ ์ํด ํ
์ ์ ๊ณตํ๋ค.
๋ฃจ์์์๋ ์ด๋ฐ ํ
๋ค์ "fallback"์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ ์๋ฐํ๊ฒ๋ ์๋ฌ ์ํ๊ฐ ์๋ ์ํ๋ฅผ ๋ค๋ฃจ๋๋ฐ๋ ์ฌ์ฉ๋๋ค. ์ด๋ฐ ์ํ๋ค์ Table๋ด์ ์กด์ฌํ์ง ์๋ ํ๋๋ฅผ ์ต์ธ์คํ๋ค๊ฑฐ๋ garbage collection์ ์ ํธํ๋ ๊ฒ๋ฑ๋ฑ์ด ๋ ์ ์๋ค. ๋ฃจ์๋ ๊ธฐ๋ณธ fallback ํธ๋ค๋ฌ๋ค์ ์ ๊ณตํ์ง๋ง ์ฌ๋ฌ๋ถ์ setfallback ๋ด์ฅํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ fallback ํธ๋ค๋ฌ๋ฅผ ์ค์ ํ ์ ์๋ค. ์ด setfallback ํจ์๋ fallback ์ํ๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํ ๋ฌธ์์ด(์๋ ํ ์ฐธ์กฐ)๊ณผ ์ํ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ์คํ๋ ํจ์๋ฅผ ์ธ์๋ก ๊ฐ์ง๋ค. setfallback ํจ์๋ ์ด์ ์ fallback ํจ์๋ฅผ ๋ฐํํ๋ฏ๋ก ํ์ํ๋ค๋ฉด fallback ํธ๋ค๋ฌ๋ค์ ๊ต์ฒดํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
| ๋ฌธ์์ด | ์ํ |
| "arith" | ์ ๋ฒํ์ง์์ ์ฐ์ฐ์์์์ ์ฐ์ ์ฐ์ฐ |
| "order" | ๋ถ์ ํํ ์ฐ์ฐ์์์์ ์์ ๋น๊ต |
| "concat" | ๋ถ์ ํํ ์ฐ์ฐ์์์์ ๋ฌธ์์ด ์ฐ๊ฒฐ |
| "getglobal" | ์ ์๋์ง ์์ ์ ์ญ๋ณ์์ ๊ฐ์ ์ฝ๋ ์ค |
| "index" | ํ ์ด๋ธ์ ์กด์ฌํ์ง์๋ ์ธ๋ฑ์ค์ ๊ฐ์ ๋ฐ๋ ์ค |
| "gettable" | ํ ์ด๋ธ์ด ์๋๋ฐ ์ธ๋ฑ์ค์ ๊ฐ์ ์ฝ๋ ์ค |
| "settable" | ํ ์ด๋ธ์ด ์๋๋ฐ ์ธ๋ฑ์ค์ ๊ฐ์ ์ฐ๋ ์ค |
| "function" | ํจ์๊ฐ ์๋๋ฐ ํธ์ถํจ |
| "gc" | ๊ฐ ํ ์ด๋ธ์ด ์์ง๋๋ ๊ฒ์ ์ํ garbage collection๋์์ ํธ์ถ๋จ(Called during garbage collection for each table being collected) |
| "error" | ์ฌ๊ฐํ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ํธ์ถ๋จ |
7 Fallback์ ํตํ ์์ #
๋ฃจ์์์ fallback์ ๊ฐ์ฅ ํฅ๋ฏธ์๋ ์ฌ์ฉ ์ฉ๋ ์ค ํ๋๋ ์์์ ๊ตฌํ์ด๋ค. ๊ฐ๋จํ ์์์ ๊ฐ์ฒด๋ก ํ์ฌ๊ธ ํน๋ณํ ๊ทธ ๊ฐ์ฒด์ "parent;"๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ์ฒด์์์ ์กด์ฌํ์ง ์๋ ํ๋์ ๊ฐ์ ์ฐพ๋ ๊ฒ์ ํ๋ฝํ๋ค. (์ด ํ๋๋ ๋ฉ์๋๊ฐ ๋ ์๋ ์๋ค) ์ด ์ฒด๊ณ๋ ๊ฐ์ฒด ์์์ ํ ์ข
๋ฅ์ด๋ฉฐ, Smalltalk๋ C++์์ ์ ์ฉ๋ ๋์ฑ ์ ํต์ ์ธ ํด๋์ค ์์๊ณผ๋ ๋์กฐ๋๋ค. ๋ฃจ์๋ด์์์ ๊ฐ๋จํ ์์์ ๊ตฌํํ๋ ํ๋์ ๋ฐฉ๋ฒ์ ๋ณ๋์ ํ๋ - ์๋ฅผ ๋ค์๋ฉด "parent" - ๋ด์ ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ "index" fallback ํจ์๋ฅผ ์ค์ ํ๋ ๊ฒ์ด๋ค. ์๋ ์ฝ๋๋ฅผ ๋ด๋ผ.
function Inherit(t,f)
if f == "parent" then -- loop๋ฅผ ํผํ๊ธฐ ์ํ ๊ฒ์
return nil
end
local p = t.parent
if type(p) == "table" then
return p[f]
else
return nil
end
end
setfallback("index", Inherit)
์ด ์ฝ๋๋ Inheritํจ์๋ฅผ ์ ์ํ๊ณ ๊ทธ๊ฒ์ "index" fallbackํจ์๋ก ์ค์ ํ๋ค. ๋ฃจ์๊ฐ ๊ฐ์ฒด์์ ์กด์ฌํ์ง ์๋ ํ๋๋ฅผ ์ต์ธ์คํ๋ ค๊ณ ํ ๋๋ง๋ค, fallback ๊ธฐ๋ฅ์ด Inheritํจ์๋ฅผ ํธ์ถํ๋ค. ์ด ํจ์๋ ๋งจ์ฒ์ Table ๊ฐ์ ๋ด๊ณ ์๋ parentํ๋๋ฅผ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋์ง ๊ฒ์ฌํ๋ค. ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด, ๋ถ๋ชจ ๊ฐ์ฒด๋ด์ ์ํ๋ ํ๋๋ฅผ ์ต์ธ์คํ๋ ๊ฒ์ ์๋ํ ๊ฒ์ด๋ค. ๋ง์ผ ๋ถ๋ชจ๋ด์๋ ๊ทธ ํ๋๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด fallback์ ์๋์ ์ผ๋ก ๋ค์ ํธ์ถ๋๋ค. ์ด ์ฒ๋ฆฌ๋ ํ๋์ ๊ฐ์ ์ฐพ๊ฑฐ๋ ๋ถ๋ชจ๋ฅผ ์ฐพ์๊ฐ๋ ํธ์ถ์ด ๋๋ ๋๊น์ง "์์ชฝ์ผ๋ก" ๋ฐ๋ณต๋๋ค. ๋ ๋์ ์ฑ๋ฅ์ด ํ์ํ๋ค๋ฉด ๊ฐ์ ์์ ์ฒด๊ณ๊ฐ ๋ฃจ์์ API๋ฅผ ์ฌ์ฉํ์ฌ C์์ ๊ตฌํ๋์ด์ง ์ ์๋ค.
8 ์ฌ๊ท(Reflexive) ๊ธฐ๋ฅ #
์ธํฐํ๋ฆฌํ
์ธ์ด์ธ ๊น๋ญ์ ๋ฃจ์๋ ๋ช๊ฐ์ง ์ฌ๊ท์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํ๋์ ์๋ function ํ์
์ด๋ฉฐ ์ด๊ฒ์ ์ด๋ฏธ ์ธ๊ธํ๋ค. ๋๋ค๋ฅธ ๊ฐ๋ ฅํ ์ฌ๊ท์ ์ธ ํจ์๋ค์ ํ
์ด๋ธ์๋ฅผ traverseํ๋ next, ๋ชจ๋ ์ ์ญ ๋ณ์๋ค์ traverseํ๋ nextvar์ด๋ค.
next๋ ๋๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง๋๋ฐ, ํ
์ด๋ธ๊ณผ ํ
์ด๋ธ๋ด์ ์ธ๋ฑ์ค์ด๋ฉฐ, ๋ช๊ฐ์ง ๊ตฌํ๊ณผ๋ ๋
๋ฆฝ์ ์ธ ์์์์์ "๋ค์" ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค.(ํ
์ด๋ธ์ด ํด์ฌ ํ
์ด๋ธ๋ก ๊ตฌํ๋์ด์๋ค๋ ๊ฒ์ ํ์ํด๋ผ) ๊ทธ๊ฒ์ ๋ํ ํ
์ด๋ธ๋ด์ ์ธ๋ฑ์ค์ ์ฐ๊ด๋ ๊ฐ์ ๋ฐํํ๋ค. (๋ฃจ์์ ํจ์๋ค์ ๋ค์์ ๊ฐ์ ๋ฐํํ ์ ์์์ ์๊ธฐํด๋ผ) nextvar ํจ์๋ ๋น์ทํ ์ญํ ์ ํ์ง๋ง ํ
์ด๋ธ์ ์ธ๋ฑ์ค๋ค๋์ ์ ์ ์ญ๋ณ์๋ค์ traverseํ๋ค๋ ๊ฒ๋ง ๋ค๋ฅด๋ค.
์ฌ๊ท๋ฅผ ์ฌ์ฉํ ํฅ๋ฏธ์๋ ์๋ ๋์ ํ์
์ง์ ์ด๋ค. ์ด์ ์ ์๋ ค์ฃผ์๋ฏ์ด, ๋ฃจ์๋ ์ ์ ํ์
์ง์ ์ด ์๋ค. ์ด์จ๊ฑฐ๋ ๋๋๋ก ํ๋ก๊ทธ๋จ๋ด์์ ์ค๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฃผ์ด์ง ๊ฐ์ด ์ ํํ ํ์
์ธ์ง ๊ฒ์ฌํ๋ ๊ฒ์ ์ธ๋ชจ์๋ค. type์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ํ์
์ ๊ฒ์ฌํ๋ ๊ฒ์ ์ฝ๋ค. ๊ทธ๋ฌ๋ ํ
์ด๋ธ์์๋ ๋ฐ๋์ ๋ชจ๋ ํ๋๊ฐ ์กด์ฌํ๋์ง ๊ทธ๋ฆฌ๊ณ ์ ํํ ๊ฐ์ด ์ฑ์์ก๋์ง ๊ฒ์ฌํด์ผ๋ง ํ๋ค.
๋ฃจ์์ ๋ฐ์ดํ ๊ธฐ์ ๋ฅ๋ ฅ์ ์ฌ์ฉํด์, ํ์
์ ๊ธฐ์ ํ๊ธฐ ์ํด ๊ฐ๋ค์ ์ฌ์ฉํ ์ ์๋ค. : ํ๋์ ํ์
์ด ๊ทธ์์ ์ ์ด๋ฆ์ ์ํด ๊ธฐ์ ๋์๊ณ , ํ
์ด๋ธ ํ์
์ ํ์ํ ํ์
์ผ๋ก ๊ฐ ํ๋๋ฅผ ๋งคํํ ํ
์ด๋ธ์ ์ํด ๊ธฐ์ ๋์๋ค. (์๋ ์ฐธ์กฐ).
TNumber="number"
TPoint={x=TNumber, y=TNumber}
TColor={red=TNumber, blue=TNumber, green=TNumber}
TRectangle={topleft=TPoint, botright=TPoint}
TWindow={title="string", bounds=TRectangle, color=TColor}
์์ ๊ฐ์ด ๊ธฐ์ ํจ์ผ๋ก์จ, ์ฌ๋ฌ๋ถ์ ๊ฐ์ด ์ฃผ์ด์ง ํ์
์ ๊ฐ์ง๊ณ ์๋์ง ๊ฒ์ฌํ๋ ๋จ์ผํ, ๋คํ์ฑ์ ํจ์๋ฅผ ์์ฑํ ์ ์๋ค. ์๋ ์์ค๋ฅผ ์ฐธ์กฐํด๋ผ.
function checkType(d, t)
if type(t) == "string" then
-- t๋ type์ ์ด๋ฆ์ด๋ค.
return (type(d) == t)
else
-- t์ด Table์ด๋ค. ๊ณ ๋ก d๋ ๋ํ Table์ด ๋์ด์ผ๋ง ํ๋ค.
if type(d) ~= "table" then
return nil
else
-- d๋ ๋ํ table์ด๋ค. ๊ทธ ํ๋๋ค์ ๊ฒ์ฌํ๋ค.
local i,v = next(t,nil)
while i do
if not checkType(d[i],v) then
return nil
end
i,v = next(t,i)
end
end
end
return 1
end
์ฌ๊ท๊ธฐ๋ฅ์ ๊ทธ ์์ ์ ํ๊ฒฝ์ ์กฐ์ ํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ์ ํ์ฉํ๋ค. ์๋ฅผ ๋ค์ด ํ๋์ ํ๋ก๊ทธ๋จ์ด ๋๋ค๋ฅธ ์กฐ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ์ํด "๋ณดํธ๋ ํ๊ฒฝ"์ ์์ฑํ ์ ์๋ค. ์ด๋ฐ ์ํฉ์ ์ธํฐ๋ท์ผ๋ก ๋ถํฐ ํธ์คํธ๊ฐ ๋ฏฟ์ ์ ์๋ ์ฝ๋๋ฅผ ์คํํ๋ ค ํ ๋ ์์ด์ ํธ ๊ธฐ๋ฐ์ ์ดํ๋ฆฌ์ผ์ด์
์์ ํํ ๋ณผ ์ ์๋ค. (์๋ฅผ ๋ค์๋ฉด, ์คํ ๊ฐ๋ฅํ ์ฝํ
์ธ - ์๋ฐ์ ๊ฐ์ ์ต์ ์ ํ์ - ์ ๊ฐ์ง ์น ํ์ด์ง๋ฅผ ๋ค ์ ์๋ค.) ๋ช๋ช ํ์ฅ ์ธ์ด๋ ์์ ํ ์คํ์ ์ํ ํน๋ณํ ๊ธฐ๋ฅ์ง์์ ์ ๊ณตํด์ผ๋ง ํ๋ค. ๊ทธ๋ฌ๋ ๋ฃจ์๋ ์ด๋ฐ ์ ์ ์ง์ํ๊ธฐ ์ํด ์ธ์ด ๊ทธ ์์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ์๋ ์ถฉ๋ถํ ์ ์ฐํ๋ค๊ณ ํ ์ ์๋ค. ์๋ ์์ ๋ ์ด๋ป๊ฒ ์ ์ฒด ์ ์ญ๋ณ์๋ค์ ํ
์ด๋ธ์ ์ ์ฅํ ์ ์๋์ง ๋ณด์ฌ์ค๋ค.
function save()
-- ํ๊ฒฝ๋ณ์๋ค์ ๋ด๊ธฐ ์ํ ํ
์ด๋ธ์ ์์ฑํ๋ค.
local env = {}
-- ๊ฐ์ฅ ์ฒ์ ๋ณ์์ ๊ทธ ๊ฐ์ ์ป๋๋ค.
local n, v = nextvar(nil)
while n do
-- ํ
์ด๋ธ์ ์ ์ญ๋ณ์๋ฅผ ์ ์ฅํ๋ค.
env[n] = v
-- ๋ค์ ์ ์ญ๋ณ์์ ๊ทธ ๊ฐ์ ์ป๋๋ค.
n, v = nextvar(n)
end
return env
end
๋น์ทํ ํจ์๋ ์ ์ฅ๋ ํ๊ฒฝ์ ๋ณต๊ตฌํ๋ ๊ฒ์ด๋ค. ๋ชจ๋ ํจ์๋ค์ ๋ณ์๋ค์ ๋์
๋ first-class ๊ฐ์ด๊ธฐ ๋๋ฌธ์, ์ ์ญ ๋ณ์ ํ๊ฒฝ์์ ํจ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ํ์ฐฎ์ ์ ๋๋ก ์ฌ์ด ์ผ์ด๋ค. ์๋ ์์ ๋ ๋ณดํธ๋ ํ๊ฒฝ์ค์ ๋ด์์ ์ฝ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ๋ ํจ์๋ฅผ ๋ณด์ฌ์ค๋ค.
function runProtected(code) -- ํ์ฌ ํ๊ฒฝ์ ์ ์ฅํ๋ค local oldenv = save() -- "์ํํ" ํจ์๋ค์ ์ง์ด๋ค readfrom,writeto,execute = nil,nil,nil -- ์ ๋ขฐ๋์ง ์์ ์ฝ๋๋ฅผ ์คํํ๋ค dostring(code) -- ์๋ ํ๊ฒฝ๋ค์ ๋ณต๊ตฌํ๋ค restore(oldenv) end
9 ๋ฃจ์๋ก Tk๋ฅผ ๋ฐ์ธ๋ฉ ํ๊ธฐ #
๋ฃจ์์ ์์ฐ์ค๋ฐ ์ฉ๋๋ GUI์ ์ค์ ์ด๋ผ๊ณ ํ ์ ์๋ค. -- ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๊ฐ์ฒด(์์ ฏ)์ ์์๊ด๊ณ๋ฅผ ๊ธฐ์ ํ๊ณ ์ฌ์ฉ์ ๊ธฐ๋ฅ์ ๊ทธ ๊ฐ์ฒด๋ค์๊ฒ ๋ฐ์ธ๋ฉํ๋ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒ์ด๋ค. ๋ฃจ์๋ ์ด๋ฐ ๊ฒฝ์ฐ์ ์ ํฉํ๋ค. ์๋ํ๋ฉด ๊ฐ๋จํ๊ณ , ๊ฐ๋ ฅํ๋ฉฐ, ํ์ฅ๊ฐ๋ฅํ ๊ตฌ๋ฌธ์ ๊ฐ์ง ๋ฐ์ดํ ๊ธฐ์ ์ฒด๊ณ๊ฐ ๊ฒฐํฉ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๋ง๋ก, ์ฐ๋ฆฌ๋ ๋ฃจ์๋ฅผ ๊ฐ์ง๊ณ ๋ช๊ฐ์ง์ UI ํดํท์ ๊ฐ๋ฐํด์๋ค.
Tk๊ฐ ๋ค์ฉ๋์ GUI ํดํท์ด๋ผ๊ณ ํ ์ง๋ผ๋ Tcl์ ๋ชจ๋ ์ฌ๋๋ค์ด ๋ง์กฑํ ์ ์๋ ์ข
๋ฅ์ ์ธ์ด๋ ์๋๋ค. ์ฐ๋ฆฌ๋ Tcl์ ๋์ฒด์๋จ์ผ๋ก ๋ฃจ์๋ฅผ ๊ณ ๋ คํ ๊น๋ญ์ ์ฐ๋ฆฌ๋ ๋ฃจ์๋ก๋ถํฐ Tk ์์ ฏ๋ค์ ์ต์ธ์คํ ์ ์๋๋ก ํ๋ Tk/Lua ๋ฐ์ธ๋ฉ์ ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๊ฐ๋ฅํํ ์ฐ๋ฆฌ๋ ์์ ฏ๋ช
, ์์ฑ๋ค, ๋ช
๋ น๋ค์ ํฌํจํ Tk์ ์ฒ ํ์ ์ ์งํ๋ค. ๋ชจ๋ ์ฌ๋๋ค์ ์กด์ฌํ๋ API๋ฅผ ๊ฐ์ ํ๋ ค๊ณ ์๋ํ๋ ์ผ์ด ์ผ๋ง๋ ์ ํน์ ์ธ์ง ์๊ณ ์๋ค. ๊ทธ๋ฌ๋ ์ฅ๊ธฐ์ ์ธ ๊ฒฌ์ง์์ ๋ณด๋ฉด ๊ธฐ์กด ๊ทธ๋๋ก ๋๋๋ ๊ฒ์ด Tk ์ฌ์ฉ์๋ค์๊ฒ ๋ ์ข๋ค. ์๋๋ฉด ๊ทธ๋ค์ ์๋ก์ด ์ปจ์
์ ๋ฐฐ์ฐ๋ ค๊ณ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. (์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ๋ ์ข๋ค. ์๋๋ฉด ์๋ก์ด ๋ฉ๋ด์ผ์ ์ธ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค!)
10 Tk/Lua ์์ ฏ์ ์์ฑํ๊ธฐ #
์ฐ๋ฆฌ๋ ๋ฃจ์๋ก ๋ชจ๋ Tk ์์ ฏ๋ค์ ๋งคํํ๋ค. ์ฌ๋ฌ๋ถ์ ๋ฃจ์์ Table ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ ์์ ์ ์์ฑ๋ค์ ๊ธฐ์ ํ๋ ์์ ฏ์ ์์ฑํ๋ค. ์๋ฅผ ๋ค์ด, ์๋ ์์ ๋ ๋ฒํผ์ ํ๋ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ b์ ๋ด๋๋ค. b๋ ์ด์ ๋ฒํผ์ ๋ํํ๋ ๊ฐ์ฒด๊ฐ ๋์๋ค.
b = button{ label = "Hello world!"
command = "exit(0)"
}
์ด๋ ๊ฒ ์ ์ํ ์ดํ์๋, ์ฌ๋ฌ๋ถ์ ์ผ๋ฐ์ ์ธ ๋ฃจ์ ๋ฌธ๋ฒ์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์, b.label="Hello world from Lua!" ๋์
๋ฌธ์ ๋ฒํผ์ ๋ ์ด๋ธ์ ๋ฐ๊พธ๊ณ ๋ง์ฝ ํ๋ฉด์ ์ด๋ฏธ ๋ณด์ด๋ ์ํ๋ผ๋ฉด ๊ทธ๊ฒ์ ๋ด์ฉ์ ์
๋ฐ์ดํธ ํ๋ค. 20๋ฌธ์๋ก ํ์ ๋ ํ
์คํธ ์
๋ ฅ ์์ ฏ์ e=entry{width=20} ์ผ๋ก ์์ฑ๋ ์ ์๋ค. ํ๋ฉด์ ์๋์ฐ์ ์ด ์์ ฏ์ด ๋งคํ๋ ์ดํ์, e.current๋ ์
๋ ฅ ์์ ฏ์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ด์ฉ์ด ๋ด๊ฒจ ์๋ค. (Tcl/Tk๋ด์ ์๋ ์ ์ญ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋์ ์, ์ฐ๋ฆฌ๋ ์์ ฏ ๊ฐ์ ๋ด๊ธฐ์ํ "current" ํ๋๋ฅผ ์ฌ์ฉํ๋ค)
์์ ฏ๋ค์ ์๋์ฐ์ ์๋์ ์ผ๋ก ๋งคํ๋์ง ์๋๋ค. Tk/Tcl ํ๊ฒฝ๊ณผ๋ ๋ฌ๋ฆฌ, Tk/Lua์๋ ํ์ฌ ์๋์ฐ์ ๋ํ ๊ฐ๋
์ด ์๋ค. ์ฌ๋ฌ๋ถ์ ๋ค๋ฅธ ์์ ฏ๋ค์ ๋ด๊ธฐ ์ํ ์๋์ฐ๋ฅผ ์์ฑํด์ผ๋ง ํ๋ค (์ฃผ ์๋์ฐ๋ ์ต์์ ๋ ๋ฒจ์ ์์ ฏ์ด ๋ ์ ์๋ค) ๊ทธ๋ฆฌ๊ณ , ํ์คํ๊ฒ ์์ ฏ๋ค์ ํ๋ฉด์ ๋งคํ์์ผ์ผ๋งํ๋ค. ์๋ ์์ ๋ฅผ ๋ด๋ผ.
w = toplevel{b}
w:show()
์ด ๋ฐฉ๋ฒ์์๋ ์ฌ์ฉ์๋ ์์ ๋กญ๊ฒ ๊ทธ๋ค์ ๋ํ์์๋ค, ์ฌ์ง์ด ์ํธ ์ฐธ์กฐํ๋ ์์ ฏ๋ค์ ๊ธฐ์ ํ ์ ์๊ณ , ๊ทธ๊ฒ๋ค์ ํ์ํ ๋๋ง๋ค ๋งคํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์ฐ๋ฆฌ๋ ๋ํ ๋ช
์์ ์ผ๋ก ์์ ฏ๋ค์ ๋ฌถ๋ ์์
์ ํ์์ฑ์ ์ ๊ฑฐํ๋ค. ์๋ํ๋ฉด, ๋ฌ์ฌ์ ์ธ ๊ด์ ์์์ ๋ ์ด์์์ ์ ์ํ๋ ๊ฒ์ด ๋ ์์ฐ์ค๋ฝ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์, ์๋์ฐ(์ฃผ ์๋์ฐ๋ ์ต์์ ์๋์ฐ)์ ํ๋ ์ ์์ ฏ๋ค์ ๊ทธ๋ค์ ๋ด์ฉ๋ค์ ์๋์ ์ผ๋ก ๋ฌถ๋ Container๋ก์จ ์ฌ์ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ ์์ ๋ฅผ ๋ณด๋ฉด ๋๊ฐ์ ๋ฐ๋ฅ ๋ฒํผ๋ค์ ๊ฐ์ง ๋ฉ์ธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ์ฝ๋์์ ์ ์ ์๋ค. ๋ชจ๋ ์ผ๋ฐ Tk ์์ ฏ๋ค์ด์ธ์, ์ฐ๋ฆฌ๋ ๋ํ ๋๊ฐ์ ๋ถ๊ฐ์ ์ธ ์บ๋ฒ์ค๋ค์ ๊ตฌํํ๋ค. ํ๋์ Xlib๋ก์ ๋จ์ํ๋ API๋ก ์ฌ์ฉ๋๋ฉฐ, ๋ํ๋๋ OpenGL์์ ์ฌ์ฉ๋๋ค.
b1 = button{label="Yes", command="yes=1"}
b2 = button{label="No", command="yes=0"}
w = toplevel{message{text="Overwrite file?"},
frame{b1, b2; side="left"};
side="top"
}
๊ฑฐ์ ๋ชจ๋ ํจ์๋ค์ด ๋ฃจ์๋ก ๋งคํ๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ ๊ณต๋๋ค. ๊ทธ๋์ ์ฌ๋ฌ๋ถ์ ๋ฃจ์๋ง์ ์ฌ์ฉํ์ฌ ์์ ๋ ์์ ฏ๋ค์์ ์ง์ ์ ์ธ ์ ์ด๋ฅผ ์ฌ์ฉํ๋ ์ธ๋ จ๋ ๋น์ฅฌ์ผํ ํ๋ก๊ทธ๋จ๋ค์ ์์ฑํ ์ ์๋ค.
11 ์์ ฏ ๋ช ๋ น๋ค์ ์ต์ธ์คํ๊ธฐ #
๋ชจ๋ Tk ์์ ฏ ๋ช
๋ น๋ค์ Tk/Lua์์๋ ๊ฐ์ฒด ๋ฉ์๋๋ก์จ ๊ตฌํ๋๋ค. ์ด๋ค์ ์ด๋ฆ๊ณผ ์ธ์, ํจ์๋ค์ ๋ฏธ๋ฆฌ ์ง์ ๋์ด์๋ค. ๋ง์ผ lb๊ฐ ๋ฆฌ์คํธ๋ฐ์ค ์์ ฏ์ ์๋ฏธํ๋ค๋ฉด, lb:insert("New item")๋ ๋ฆฌ์คํธ ๋ฐ์ค์ "New item"์ ์ถ๊ฐํ๋ ๋ฌธ์ฅ์ด๋ค. (Tk์ insert๋ช
๋ น) ๋ฐ๋ฉด์, ๊ฐ์ฅ๋ง์ด ์ฌ์ฉ๋๋ Tk ์์ ฏ ๋ช
๋ น์ธ configure ๋ ๋์ด์ ํ์ํ์ง์๋ค. ์๋ํ๋ฉด ๊ทธ ๋ช
๋ น์ ์ญํ ์ด ์ง๊ธ์ ๊ฐ๋จํ ๋์
๋ฌธ๋ค์ ๋ด๊ฒจ์ ธ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ต์์ ์ฃผ ์์ ฏ๋ค์ ์๋์ฐ ๋ฉ๋์ ธ๋ก๋ถํฐ ๋ฉ์๋๋ค์ ์์ํ๋ค. ๋ง์ฝ w๊ฐ ์๋์ฐ๋ฅผ ๋ํ๋ธ๋ค๋ฉด, w:iconify()๋ ๋ช
๋ น์ด ๋ํ๋ด๋ ์๋ฏธ๋๋ก ๋์ํ ๊ฒ์ด๋ค.
12 Behind the Scenes #
Tk/Lua๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ด๋ ต์ง ์์๋ค. Tcl/Tk๋ก C ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด์, ์ฐ๋ฆฌ๋ ์๋น์ค ์ ๊ณต์๋ฅผ ์์ฑํ๊ณ ๋ฃจ์๋ก๋ถํฐ ์ต์ธ์ค๋๋๋ก ๊ทธ๊ฒ์ ๋ฑ๋กํ๋ค. ๋ฐ์ธ๋ฉ์ ๊ตฌํํ๋ ๋ฃจ์์ฝ๋๋ ์ด์ ์ ์ธ๊ธํ index fallback์ ์ฌ์ฉํ ๊ฐ์ฒด์งํฅ์ ์ ๊ทผ์ ์ฌ์ฉํ๋ค. ๊ฐ ์์ ฏ ์ธ์คํด์ค๋ ์์์ ๊ฐ์ฅ ๊ผญ๋๊ธฐ์ ์์ ฏ ํด๋์ค๋ฅผ ๊ฐ์ง ํด๋์ค ๊ฐ์ฒด๋ก๋ถํฐ ์์๋์๋ค. ์ด ํด๋์ค๋ ๋ชจ๋ ์์ ฏ๋ค์ ์ํด ์ฌ์ฉ๋๋ ์๋ ์์ ๋ ์ด ์ผ๋ฐ ํด๋์ค์ ๋ฉ์๋๋ค์ ์ ์์ ์์ ฏ์ focus๋ฅผ ์ค์ ํ๋ ๋ฉ์๋๋ฅผ ๋ณด์ฌ์ค๋ค. ์ด๊ฒ์ ๋ํ ๋ฒํผ ํด๋์ค ์ ์๋ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
widgetClass = {}
function widgetClass:focus()
if self.tkname then
tklua_setFocus(self.tkname)
end
end
buttonClass = {
parent = widgetClass,
tkwidget = "button"
}
์ด์ ์๋ค์ํผ, ๊ฐ ์์ ฏ์ ํ
์ด๋ธ ์์ฑ์์ ๊ฐ์ด ์์ฑ๋๋ค. ์์ฑ์๋ ์ธ์คํด์ค ํด๋์ค๋ฅผ ์ค์ ํ๊ณ , ์์ ฏ์ ์์ฑํ๋ฉฐ, ๊ทธ๊ฒ์ ์ ์ญ ๋ฐฐ์ด์ ๋ด๋๋ค. ์ด์จ๊ฑฐ๋, ์ฐ๋ฆฌ๋ ๋ํ ์์ ํธ๋ฆญ์ ์ฌ์ฉํ๋ค - ์ ๊ท ํ
์ด๋ธ์ ๋ฐํํ๋ ๊ฒ์ ๋์ ์ ์์ฑ์๋ ์์ ฏ์ ์์น๋ฅผ numberํ์ ID๋ก์จ ๋ฐํํ๋ค. (์๋ ์์ ๋ฅผ ๋ด๋ผ)
function button(self) self.parent = classButton tklua_ID = tklua_ID + 1 tklua_IDtable[tklua_ID] = self return tklua_ID end
๋ฐ๋ผ์, ๋ฃจ์๋ b.label๊ณผ ๊ฐ์ด ์์ ฏ์ ์ธ๋ฑ์คํ๋ ค๊ณ ์๋ํ ๋, fallback์ ํธ์ถํ๊ฒ ๋๋ค. ์๋ํ๋ฉด ์ซ์๋ค์ ์ธ๋ฑ์ค๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ํธ๋ฆญ์ ์ฐ๋ฆฌ์๊ฒ ์์ ฏ๊ตฌ๋ฌธ์ ์์ ํ ์ ์ดํ ์ ์๊ฒ ํด์ค๋ค. ์๋ฅผ ๋ค์๋ฉด b๊ฐ ๋ฒํผ์ด๊ณ (์ค์ ๋ก, b๋ ID๋ฅผ ๋ด๊ณ ์๋ค) ์ฌ๋ฌ๋ถ์ {{b.label = "New label,"}}}์ ์ค์ ํ๋ฉด fallback์ ์์ ฏ์ ๊ฐฑ์ ํ๊ธฐ ์ํด ์๋ง์ ์๋น์ค ๋ช
๋ น์ ํธ์ถํ ์ฑ
์์ด ๋ฐ๋ฅด๊ฒ ๋๋ค.
์๋ ์์ ๋ Tk/Lua์ "settable" fallback ํจ์์ด๋ค.
function setFB(id, f, v)
local h = tklua_IDtable[id]
if h == nil then
old_setFB(id,f,v)
return
end
if h.tkname and h:isAttrib(f) then
tklua_configure(h.tkname,f,v)
end
h[f] = v
end
old_setFB = setfallback("settable",setFB)
์ด fallback์ ํ
์ด๋ธ์ด ์๋ ๊ฐ์ ์ธ๋ฑ์ค์ํค๋ ค๋ ๋ชจ๋ ์๋๊ฐ ์์๋ ๋ง๋ค ํธ์ถ๋๋ค. ๋งจ์ฒ์, ์ฐ๋ฆฌ๋ ์ฒซ๋ฒ์งธ ์ธ์๊ฐ ์ ํฉํ ์์ ฏ ID์ ํด๋นํ๋ ์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ค. ๋ง์ฝ ์ ๋ฒํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์ ์ญ ๋ฐฐ์ด์ ์ต์ธ์คํจ์ผ๋ก์จ ์์ ฏ ํ
์ด๋ธ์ ๋ฐํํ๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด, ์ด์ ์ ๋ฑ๋ก๋ fallback์ผ๋ก ์คํ์ด ์ฌ๋น ๋ฅด๊ฒ ๋์ด๊ฐ๋ค.
tklua_IDtable ํ
์ด๋ธ์์ ์์ ฏ๋ค์ tkname์ด๋ผ ๋ถ๋ฆฌ๋, Tk ์์ ฏ์ ์ด๋ฆ์ ๋ด๊ณ ์๋ ๋ด๋ถ์ ์ธ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด ์ด๋ฆ๋ค์ Tk ๋ช
๋ น๋ค์ ์คํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์๋ง์ Tk ์์ ฏ์ด ์๋์ง์ ์ธ๋ฑ์ค ๊ฐ์ด ์ ๋ฒํ Tk ์์ฑ์ธ์ง๋ฅผ ๊ฒ์ฌํ๋ค. ๋ง์ผ ์ ๋ฒํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์๋น์ค ์ ๊ณต์์์ ์์ ฏ ์์ฑ์ ๋ณ๊ฒฝํ๋๋ก ์์ฒญํ๋ค. (๋ฑ๋ก๋ tklua_configure C ํจ์๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์ํ๋๋ค) h[f]=v ๋ฌธ์ฅ์ ์ฐ๋ฆฌ๊ฐ Tk ์์ฑ์ด์ธ์ ๊ฐ์ ๋ด๊ธฐ์ํด ์์ ฏ ํ
์ด๋ธ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ณด์ฆํ๋ค.
"gettable" fallback์ ๊ตฌํํ๋ ๊ฒ์ ๋น์ทํ๋ค. ๋๊ฐ์ fallback์ ๋ง๋ถ์ฌ, Tk/Lua๋ ๋ํ ์์์ ๊ตฌํํ๊ธฐ ์ํด index fallback์ ์ฌ์ฉํ๋ฉฐ(์์ ์ฐธ์กฐ), "function" fallback์ ์์ ฏ ๋ช
๋ น์ด๋ ์๋์ฐ ๋ฉ๋์ ธ ๋ช
๋ น๋ค์ ํธ์ถํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
13 ๊ฒฐ๋ก #
ํ์ฅ ์ธ์ด๋ค์ ์ธ์ ๋ ํ๊ฐ์ง ํน์ ๋๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฒ์ญ๋๋ค. ๊ฐ๋จํ ํ์ฅ ์ธ์ด๋ค์ ์์ค์ฝ๋๋ก๋ถํฐ ์ง์ ์ ์ผ๋ก ๋ฒ์ญ๋ ์ ์๋ค. ๋ฐ๋ฉด์ ์๋ฒ ๋๋ ์ธ์ด๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๋ณต์กํ ๋ฌธ๋ฒ๊ณผ ๊ตฌ๋ฌธ์ ๊ฐ์ง ๊ฐ๋ ฅํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค์ด๋ค. ์๋ฒ ๋๋ ์ธ์ด๋ค์ ์ํ ๋์ฑ ํจ๊ณผ์ ์ธ ๊ตฌํ ํ
ํฌ๋์ ์ด๋ฏธ ํ์คํ ๋์๋ค : ์ธ์ด์ ๋ชฉ์ ์ ๋ง๊ฒ ๊ฐ์๋จธ์ ์ ๋์์ธํ๊ณ , ํ์ฅ ํ๋ก๊ทธ๋จ๋ค์ ์ฌ์ฉ๋ ๊ธฐ๊ณ๋ฅผ ์ํ ๋ฐ์ดํธ์ฝ๋๋ค๋ก ์ปดํ์ผํ๊ณ , ๋ฐ์ดํธ์ฝ๋๋ค์ ๋ฒ์ญํ๋ ๊ฒ์ ์ํด ๊ฐ์๋จธ์ ์ ์๋ฎฌ๋ ์ด์
ํ๋ค. ์ฐ๋ฆฌ๋ ๋ฃจ์๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ด ๋ณตํฉ ๊ตฌ์กฐ๋ฅผ ์ ํํ๋ค. ์๋ํ๋ฉด ์๋ฏธ์ ๋ฌธ๋ฒ ๋ฌธ์์ ๋จ์ง ํ๋ฒ ์ด๋ฃจ์ด์ง๋ฉฐ, ๊ทธ๊ฒ์ ๋ณด๋ค ๋ ๋น ๋ฅธ ์คํ์๋๋ก ๋ํ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ, ๊ทธ๊ฒ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ด ๊ธฐ์ปดํ์ผ๋ ๋ฐ์ดํธ์ฝ๋ ํ์๋ด์์๋ง ์ ๊ณต๋๋ ๊ฒ๋ง์ ํ๋ฝํ๋ฉฐ, ๋์ฑ ๋น ๋ฅธ ๋ก๋ฉ๊ณผ ๋์ฑ ์์ ํ ํ๊ฒฝ์ ์ ๊ณตํ๊ฒ ๋๋ค.
code์ ํฐํธ๊ฐ ์์ ๋ fixedsys์ธ๊ฐ์? ํ๊ธ์ด ๋ค ๊นจ์ง๋๊ฒ ๊ฐ์๋ฐ์? 222.110.63.92 2004-09-09T07:45:19
์๋๋๋ค. Lusida Console์
๋๋ค. ์ ์๋ณด์ด๋๋ฐ...
- redpixel 2004-09-09T11:20:31
- redpixel 2004-09-09T11:20:31
๋ฌธ์ ์ ํฐํธ๋ฅผ ์ง์ฐ๋ ์ ๋๋ก ๋์ค๋๊ตฐ์. ์ง์ ํฐํธ๊ฐ ์๋๋ฐ ์ํ๊ฒ์ด ๋์ค๋ค๋ IE ๋๋น ์. - 203.229.151.196 2004-09-10T13:52:30









