Lisp로 주문 외기 - 5 -

2009-02-03

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

게임 세계를 위한 데이터 정의

형식(Form)에 대해 조금 더 배우기 위해, 게임 세계의 데이터를 만드는 형식을 좀 만들어봅시다. 일단은, 게임에는 플레이어가 집어들어 사용할 수 있는 특정 물체들이 있을 겁니다. 이걸 정의해 봅시다.

(setf objects ‘(whiskey-bottle bucket frog chain))

좋아요. 이제 이 줄이 뭘 의미하는지 해부해 봅시다. Lisp 컴파일러는 항상 코드 모드로 읽기 시작하고 형식을 기대하기 때문에, 첫번째 기호-setf-는 명령어가 되어야 합니다. 이 경우, 명령어는 변수에 값을 지정합니다. 변수는 objects (Lisp를 쓰는 사람들은 편의를 위해 전역변수는 이름 앞뒤로 별을 붙여줍니다.) 그리고 지정해줄 값은 네 개의 물체를 가진 목록입니다. 이제, 목록이 데이터(컴파일러가 whiskey-bottle이라는 함수를 실행하려고 애쓰는 걸 원하진 않죠.)이기 때문에 이 목록을 읽을 때는 컴파일러를 데이터모드뒤집어야 합니다. 목록의 앞에 있는 작은 따옴표가 컴파일러에게 뒤집으라고 말해주는 명령어입니다. objects 왜 명령어가 setf라고 불리는지 궁금해할지도 모르겠습니다만… 사실, 왜 그런지는 모르겠습니다만, Lisp에서 매우 많은 명령어가 괴상한 이름을 가지고 있습니다. 그냥 Lisp가 그런 고대언어기 때문이겠죠. 이건 실제론 어떤 면에서는 유용합니다. 왜냐면 Lisp의 버전들에서 일반 명령들은 Lisp를 독특하게 해 주는 모든 종류의 우아한 힘들을 가지고 있습니다. 그러니까 Lisp의 명령어는 괴상하므로, 다른 언어들에 비해서 철자가 덜 헷갈립니다. setf 명령은, 예를 들면, 이 강좌에서는 건드려볼 기회도 없을 똑똑한 능력들을 많이 가지고 있습니다.

이제 우리는 몇 개의 물체를 정의했습니다. 그걸 한 발자국 더 끌어올려 봅시다. 그리고 실제 세계 자체의 지도를 정의해 봅시다. 여기에 우리 세계가 어떻게 생겼는지 알려주는 그림이 있습니다.

world

이 간단한 게임에서, 장소는 세 군데 밖에 없습니다. 거실과 다락이 있는 집에는 마당이 딸려 있습니다. 이 작은 세계를 묘사하는 map 이라고 하는 새 변수를 정의해 봅시다.

(setf map ‘((living-room (you are in the living-room of a wizards house. there is a wizard snoring loudly on the couch.) (west door garden)
(upstairs stairway attic)) (garden (you are in a beautiful garden. there is a well in front of you.) (east door living-room)) (attic (you are in the attic of the wizards house. there is a giant welding torch in the corner.) (downstairs stairway living-room))))

이 지도는 세 지역에 대해 알기 원하는 중요한 것들을 모두 포함하고 있습니다. 장소에 대한 독특한 이름, (즉, living-room, garden, attic) 거기서 볼 수 있는 것들에 대한 짧은 설명 (더 큰 목록 안에 포함된 자기의 목록에 저장되어 있다.), 거기에 더해 각 길이 그 장소로 어디로 어떻게 오가는가 하는 것도. 이 하나의 변수가 얼마나 정보가 풍부한지, 그리고 어떻게 우리가 알아야 할 필요가 있는 것에 대해 딱 필요한 만큼만 충분히 묘사하고 있는 주목하세요. Lisp를 쓰는 사람들은 작고, 간결한, 기름을 완전히 빼고 그냥 보는것만으로도 이해가 가능한 코드를 만드는 것을 종아한답니다.

이제 지도와 물체 다발이 생겼습니다. 그건 이 물체들이 지도 어디에 있는지 알려주는 다른 변수들을 만들 수 있는 감각을 키워줬을 겁니다.

(setf object-locations ‘((whiskey-bottle living-room) (bucket living-room) (chain garden) (frog garden)))

각각의 물체는 한 장소와 연관되었습니다. Lisp에서 이 같은 목록들을 놀랄 것도 없이, 연관 목록이라고 합니다. 연관목록은 목록들을 적어놓은 간단한 목록 하나입니다. 각 목록 안에 있는 첫 번째 항목 위치가 다른 데이터 다발과 연관된 열쇠 기호 입니다. map 변수 또한 연관 목록이었습니다. 그 경우 세 개의 열쇠는 living-room, garden, attic 입니다.

이제 이 세계를 정의했으니, 남은 것은 게임을 즐기는 플레이어의 위치를 정해주는 겁니다.

(setf location ’living-room)

이제 게임 명령을 만들어 봅시다! drink

Lisp로 주문 외기 - 4 - Lisp로 주문 외기 - 6 -