(defstruct animal nil name (:method get-name (me) (if me.name me.name (error `get-name: animal @me has no name`))) (:method speak (me stream) (error "abstract animal cannot speak"))) (defstruct dog animal (:method speak (me : (stream *stdout*)) (put-line `@{me.(get-name)}: bark!` stream))) (defstruct cat animal (:method speak (me : (stream *stdout*)) (put-line `@{me.(get-name)}: meow!` stream))) (defstruct lab dog) (defstruct collie dog) (let ((pet1 (new collie name "Lassie")) (pet2 (new cat name "Max"))) pet1.(speak) pet2.(speak))