Common Lisp의 해시 테이블은 연관 데이터를 저장하기 위한 자료 구조예요. 키를 값에 대응시키는데, 키와 값 모두 어떤 객체든 될 수 있어요.
해시 테이블은 make-hash-table 함수로 만들 수 있어요.
make-hash-table 함수는 해시 테이블의 초기 크기와 크기 재조정 임계값을 세밀하게 조정하기 위한 여러 키워드 매개변수를 받아요. 이런 값들에 대한 자세한 내용은 문서를 참고해요.
더 중요한 것은, 키와 값을 삽입하고 조회하고 제거할 때 키를 어떻게 비교할지 정의하는 test 키워드 매개변수도 받는다는 점이에요.
test 인자로 쓸 수 있는 값은 'eq, 'eql, 'equal, 'equalp 중 하나이고, 이들은 일반 동등성 술어에 대응해요.
기본값은 'eql이에요.
키로 값을 가져오려면 gethash를 사용해요.
gethash는 키가 해시 테이블에 없을 때 반환할 값 역할을 하는 [선택적 인자][concept-defualt-arguments]를 받아요.
gethash는 여러 값도 반환하는데, 이건 다른 개념에서 설명해요.
첫 번째 값은 해시 테이블에서 그 키에 대응하는 값이고, 기본값을 지정했다면 그 기본값이며, 키가 없으면 NIL이에요.
두 번째 값은 키가 해시 테이블에 있었는지 여부를 나타내는 불리언이에요.
키와 값의 쌍을 넣으려면 gethash와 함께 setf를 사용해요.
키와 그 값을 제거하려면 remhash를 사용해요.
모든 키와 값을 제거하려면 clrhash를 사용해요.
Common Lisp의 해시 테이블은 다른 언어에서처럼 순서가 보장되지 않지만, 때로는 각 키와 값의 쌍을 처리하면서 순회하는 것이 유용할 수 있어요.
이럴 때는 maphash를 사용할 수 있어요:
(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)
(각 키와 값을 cons 쌍으로 한 줄에 하나씩 출력해요.)
(setf *hash-table* (make-hash-table)) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*) ; => NIL
; NIL
(gethash :foo *hash-table*
:default-value) ; => :DEFAULT-VALUE
; NIL
(setf (gethash :foo *hash-table*) :bar) ; => :BAR
(gethash :foo *hash-table*) ; => :BAR
; T
(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*) ; => :VALUE
; T
(remhash :key *hash-table*) ; => T
(gethash :key *hash-table*) ; => NIL
; => NIL
(clrhash *hash-table*) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*) ; => NIL
; NIL