Common Lisp의 해시 테이블은 연관 데이터를 저장하기 위한 자료 구조예요. 키(어떤 객체든 될 수 있어요)를 값(역시 어떤 객체든 될 수 있어요)에 대응시켜요. 다른 언어에서는 이 개념을 맵, 딕셔너리, 해시라고 부르기도 해요.
해시 테이블은 make-hash-table 함수로 만들 수 있어요.
(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>
(해시 테이블이 출력되는 모습은 구현에 따라 다르기 때문에, REPL에서는 다르게 보일 수도 있어요.)
해시 테이블에서 키로 값을 가져오려면 gethash 함수를 사용해요:
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
gethash는 여러 개의 값을 반환하는데, 이는 다른 개념에서 설명해요.
해시 테이블에 값을 넣으려면 gethash와 함께 setf를 이렇게 사용해요:
(setf (gethash :foo *hash-table*) :bar) : => :bar
이렇게 하면 해시 테이블 *hash-table*에서 키 :foo에 대한 값이 :bar로 바뀌어요.
그리고 그 값을 반환해요.
setf의 사용법은 다른 개념에서 설명해요.
라몬트는 자기만의 비디오 게임을 만들고 싶어 하는 리스프 외계인이에요. 라몬트가 도움을 요청한 작업 중 하나는 최고 점수 목록을 관리하는 일이에요.
인자를 전혀 받지 않고 비어 있는 새로운 해시 테이블로 평가되는 함수 make-high-score-table을 정의해요:
(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
테이블에 플레이어를 추가하려면 두 개의 인자를 받는 함수 add-player를 정의해요:
플레이어의 초기 점수는 0으로 설정해요.
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
플레이어의 점수를 설정하려면 세 개의 인자를 받는 함수 set-score를 정의해요:
(set-score hash-table :louis 1234) ; => 1234
테이블에서 플레이어의 점수를 가져오려면 두 개의 인자를 받는 함수 get-score를 정의해요:
이 함수는 플레이어에 대해 저장된 점수로 평가되어야 해요.
그 플레이어에 대해 저장된 점수가 없거나, 그 플레이어가 아직 테이블에 없다면 0으로 평가해요.
(get-score hash-table :louis) ; => 1234
(get-score hash-table :lilly) ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0
최고 점수 테이블에서 플레이어를 제거하려면 두 개의 인자를 받는 함수 remove-player를 정의해요:
이 함수는 플레이어가 아직 테이블에 추가되지 않은 경우도 문제없이 처리해야 해요. 플레이어를 제거한 뒤에 테이블에서 그 플레이어의 점수를 가져오면 당연히 0이 돼요.
(set-score hash-table :louis 1234) ; => 1234
(remove-player hash-table :louis) ; => T
(get-score hash-table :louis) ; => 0
(remove-player hash-table :not-in-the-table) ; => NIL
Exercism에 가입하고 Common Lisp 트랙을 개념 27개연습 문제 92개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.