+(in-package "SPECIALIZABLE")
+
;;;; CONS-SPECIALIZER example
(defclass cons-specializer (extended-specializer)
((car :initarg :car :reader %car)))
(eql (car obj) (%car specializer))))
;;; but this one does: it doesn't look like it here, but at issue is
;;; who is responsible for the SPECIALIZER< method for two distinct
-;;; user-defined specializers.
+;;; user-defined specializers. Also consider a symbol generalizer
+;;; being used to compare two class specializers.
(defmethod specializer< ((s1 cons-specializer) (s2 cons-specializer) generalizer)
(declare (ignore generalizer))
(if (eql (%car s1) (%car s2))
(cadr form))
(defmethod walk ((form (cons let)))
(let ((bindings (cadr form)))
- `(with-bindings ,bindings ,@(cddr form))))))
+ `(with-bindings ,bindings ,@(mapcar #'walk (cddr form)))))
+
+ (assert (equal (walk t) '(lookup t)))
+ (assert (equal (walk nil) '(lookup nil)))
+ (assert (equal (walk '(foo bar)) '(call (flookup foo) (list (lookup bar)))))
+ (assert (equal (walk '(quote bar)) 'bar))
+ (assert (equal (walk '(let foo bar)) '(with-bindings foo (lookup bar))))))