elisp で weak reference を使う

make-hash-table を :weakness キーワードを付けて呼ぶと使えるみたい。

まずは weakness なハッシュ表を作る

(setq hash (make-hash-table :weakness 'value))
=> #<hash-table 'eql value 0/65 0x1029e400>

他の変数から参照されてるリストとそうでないリストをハッシュ表につっこむ

(setq val '(1 2))
=> (1 2)
(puthash 1 val hash)
=> (1 2)
(puthash 2 '(3 4) hash)
=> (3 4)

値を取ってみる

(gethash 1 hash)
=> (1 2)
(gethash 2 hash)
=> (3 4)

ここまでは普通のハッシュ表とかわんない。ここで gc してから値を取る

(garbage-collect)
=> ((251845 . 38468) (31201 . 0) (1449 . 1290) 1682259 862214 (214 . 345) (2828 . 77) (60311 . 2689))
(gethash 1 hash)
=> (1 2)
(gethash 2 hash)
=> nil

1 で参照してる値は val からも参照してるから値が取れる。2 で参照してる値は誰も参照してないから値が取れない。ちゃんと weak reference になってる。