Lisp로 주문 외기 - 8 -

2009-05-12

라이센스 - The GNU Free Documentation License 원저자 - Conrad Barski, M.D. 원본 출처 - http://lisperati.com/casting.html

주문(SPEL) 외기

이제 Lisp의 믿을 수 없을 만큼 강력한 기능을 배워 볼 겁니다. 바로 SPEL(주문)만들기지요! SPEL 은 “Semantic Program Enhancement Logic"의 줄임말이고 컴퓨터 코드의 세계 안에서 Lisp언어를 우리 필요에 따라 개조하기 위해 가장 기초적인 수준까지 바꾸는 행동을 만드는 걸 가능케 해 줍니다. - 이게 Lisp에서 가장 마술처럼 보이는 부분이지요. SPEL을 가능하게 하기 위해, 일단 Lisp 컴파일러에서 SPEL을 활성화 할 필요가 있습니다. (이 줄에 대해서 걱정하지 마세요. 더 나은 Lisp프로그래머로 나아가려면 클릭하세요. (defmacro defspel (&rest rest) (defmacro ,@rest))</code> 자, 이제 활성화 되었습니다. 첫 번째 주문(spell)을 외워보죠. <em>walk</em>입니다. <code>(defspel walk (direction)<br> (walk-direction ‘,direction))

이 코드가 하는 것은 Lisp컴파일러에 walk라는 단어는 실제로 walk라는 단어가 아니라, walk-direction이고, direction이란 단어는 보이진 않지만 실제로 앞에 작은 따옴표를 가지고 있다는 것을 알려줍니다. 기본적으로 좀 특별한 코드를 프로그램 안에 살짝 넣을 수 있고, 컴파일러는 그게 컴파일 되기 전에 다른 걸로 바꾸게 됩니다. spel_compile 이 함수가 우리가 길을 묘사하기 위해 사용했던 코드와 얼마나 비슷한지를 주목하세요. Lisp에서, 코드와 데이터가 비슷하게 보일 뿐만 아니라, 코드와 컴파일러에 보내는 특수명령(SPELs)도 비슷하게 보입니다. 아주 일관적이고 깔끔한 모양새지요! 새 주문을 시험해 봅시다!

(walk east)

==> (YOU ARE IN THE LIVING ROOM OF A WIZARD’S HOUSE.THERE IS A WIZARD SNORING LOUDLY ON THE COUCH.THERE IS A DOOR GOING WEST FROM HERE.THERE IS A STAIRWAY GOING UPSTAIRS FROM HERE.YOU SEE A WHISKEY-BOTTLE ON THE FLOOR.YOU SEE A BUCKET ON THE FLOOR)

훨씬 낫군요!

이제 물건을 집어드는 명령을 만들 겁니다.

(defun pickup-object (object) (cond ((is-at object location object-locations) (push (list object ‘body) object-locations) `(you are now carrying the ,object)) (t ‘(you cannot get that.))))

이 함수는 현재 위치의 바닥에 물건이 있는지 검사하고- 만일 있다면 새로운 위치(플레이어의 몸)에다 목록을 밀어(push)놓습니다.(민다(push)는 것은 assoc 명령이 새 항목을 발견한다면 목록에 항목을 더하고 나서 지난 위치를 숨긴다는 겁니다.) 그리고 나서 성공했는지 알려주는 문장을 돌려줍니다. 이제 명령을 좀 더 사용하기 쉽게 만드는 다른 주문(SPEL)을 외어 봅시다.

(defspel pickup (object) `(pickup-object ‘,object))

이제 새 주문(SPEL)을 써 봅시다!

(pickup whiskey-bottle)

==> (YOU ARE NOW CARRYING THE WHISKEY-BOTTLE)

이제 몇 가지 유용한 명령을 추가해 봅시다. 일단, 지금 들고다니고 있는 물건들을 보는 명령부터.

(defun inventory () (remove-if-not (lambda (x) (is-at x ‘body object-locations)) objects))

이제 어떤 물건을 얻었다면 알려주는 함수.

(defun have (object) (member object (inventory)))

난 명복 못 빌겠다. 인터넷이 없는 생활