9

Common Lisp CLOS オブジェクトをハッシュテーブルのキーとして使用したいと考えています。私はそれが次のように簡単だと思った:

(defclass my-class () ((a :accessor a :initarg a)))

(defun my-class= (my-instance-1 my-instance-2)
(equal (a my-instance-1) (a my-instance-2)))

(defparameter my-hash-table (make-hash-table :test #'my-class=))

Common Lisp Hyperspec を調べてみると、等価性をテストするために eq、eql、equal、または equalp しか使用できないようです。

これを行う方法はありますか?それとも、これは本当にばかげたことであり、それが標準で許可されていない理由ですか?

4

1 に答える 1

9

Common Lisp 標準は、追加のテスト関数 (標準のもの以外) を提供するメカニズムを提供していません。次の 2 つのオプションがあります。

  1. 移植可能なハッシュテーブル実装である genhash genhashを使用します (組み込みのものとは互換性がありません)。
  2. 非標準の拡張子を使用する:
    1. SBCLにはsb-ext:define-hash-table-test機能があります(ドキュメント
    2. Clisp にも同様の機能がありますext:define-hash-table-test(ドキュメント)
    3. Allegro ans Lispworks は、引数に標準外の値を受け入れ、:test引数を持ち:hash-functionます ( AllegroLispworks )。
于 2011-07-07T03:15:02.043 に答える