2011-07-07 34 views
8

Tôi muốn sử dụng các đối tượng Common Lisp CLOS làm các khóa trong một hashtable. Tôi nghĩ nó sẽ đơn giản như thế này:Sử dụng các đối tượng chung của Lisp CLOS làm khóa trong một hashtable?

(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=)) 

Kiểm tra Lisp Hyperspec thông thường, có vẻ như tôi chỉ có thể sử dụng eq, eql, bằng hoặc ngang nhau để kiểm tra bình đẳng.

Có cách nào để tôi có thể thực hiện việc này không? Hay đây chỉ là một điều thực sự khó khăn để làm, và đó là lý do tại sao tiêu chuẩn không cho phép điều đó?

Trả lời

8

Chuẩn Lisp thường không cung cấp bất kỳ cơ chế nào để cung cấp các chức năng kiểm tra bổ sung (các tiêu chuẩn chuẩn). Bạn có 2 lựa chọn:

  1. Sử dụng genhash genhash đó là thực hiện di bảng băm (không tương thích với những người thân built-in) mở rộng
  2. Sử dụng phi tiêu chuẩn :
    1. SBCL có sb-ext:define-hash-table-test function (documentation)
    2. Clisp có chức năng tương tự ext:define-hash-table-test (documentation)
    3. Allegro ans Lispworks chấp nhận giá trị không chuẩn cho :test đối số và có đối số :hash-function (Allegro, Lispworks).
+0

Genhash là, nếu không có gì khác, khá ổn định (và được goverened bởi CDR). – Vatine

Các vấn đề liên quan