U E D R S I H C RSS
ID
Password
Join
์ง€๊ฐ‘์—๋Š” ์•„๋ฌด๋„ ์†๋Œ€์ง€ ์•Š์€ 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]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) ๊ธฐ๋Šฅ. ๋†’์€ ๋‹คํ˜•์ ์ธ ๋ถ€๋ถ„์˜ ์ƒ์„ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

๋ฃจ์•„๋Š” ๋ฐ์ดํƒ€ ์ •์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ชฉ์ ์˜ ์ž„๋ฒ ๋””๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. ๊ณต์šฉ์†Œ์œ ๊ถŒ(public domain)์— ์žˆ์ง€ ์•Š๋‹ค ํ•˜๋”๋ผ๋„ (TeCGraf๋ผ๋Š” ํšŒ์‚ฌ๊ฐ€ ์ €์ž‘๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค), ๋ฃจ์•„๋Š” ํ•™์ˆ ์ ์ด๋‚˜ ์ƒ์—…์ ์ธ ๋ชฉ์  ์–‘์ชฝ์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. [http]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

๋ฌธ์ œ์˜ ํฐํŠธ๋ฅผ ์ง€์šฐ๋‹ˆ ์ œ๋Œ€๋กœ ๋‚˜์˜ค๋Š”๊ตฐ์š”. ์ง€์ •ํฐํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ ์—„ํ•œ๊ฒƒ์ด ๋‚˜์˜ค๋‹ค๋‹ˆ IE ๋‚˜๋น ์š”. - 203.229.151.196 2004-09-10T13:52:30

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.7744 sec