Christophe Weblog Wiki Code Publications Music
fix one package export
[specializable.git] / cons-specializer.lisp
index 70529d4ae4d4709df38d020a6b17183588d9787e..c0ec716a3d51f8c0aeb82aab703836d3aaeffce9 100644 (file)
@@ -1,3 +1,5 @@
+(in-package "SPECIALIZABLE")
+
 ;;;; CONS-SPECIALIZER example
 (defclass cons-specializer (extended-specializer)
   ((car :initarg :car :reader %car)))
@@ -35,7 +37,8 @@
        (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))))))