Допустим, есть следующий код:
(defpackage :foo
(:use :common-lisp)
(:export x))
(defpackage :bar
(:use :common-lisp :foo))
(in-package :foo)
(defgeneric m (arg))
(defun x (obj) (m obj))
(in-package :bar)
(defclass my-class () ())
(defmethod m ((obj my-class)) (print "Ok"))
(defvar obj (make-instance 'my-class))
(m obj)
(x obj)
То есть у нас есть пакет foo с функцией x, которая выполняет некоторые действия с переданным объектом, вызывая его метод m. При этом я бы хотел использовать принцип утиной типизации - если у любого объекта есть метод m, значит он умеет делать то, что нужно функции x.
Проблема возникает, если класс переданного объекта описан в другом пакете, который не импортирован в foo (в примере выше класс находится в пакете bar). SBCL ругается:
Unhandled SIMPLE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
{10029365E3}>:
There is no applicable method for the generic function
#<STANDARD-GENERIC-FUNCTION FOO::M (0)>
when called with arguments
(#<MY-CLASS {1002A00803}>).
Как эту проблему следует решать?