Я нашёл глюк в этой штуке. Реализация no-applicable-method не соответствует стандарту и работает криво. Вот что выяснилось:
(defun dummy(a &optional l) (format t "Dummy ~A ~A~%" a l) ; ЗАТЫЧКА для ECL ) ;(defmethod no-applicable-method ((mthd (eql #'draw)) &rest args) ;; CLISP format, ANSI compliant (defmethod no-applicable-method ((mthd (eql #'draw)) args ) ;; ECL format, not ANSI compliant "Here we will handle an error if we try to draw something that we can't draw" (format t "Ooops! No method to ~w an ~w.~%" mthd args) #'dummy ; ECL-specific workaround )
CLISP преспокойнейше работает, если возвращаемый объект никому не передаётся, а вот ECL упрямо хочет трактовать возвращаемое как функцию и вызывает её. Из-за чего отсутствие dummy всё равно вызывает падение - то есть, например, если возвращать NIL, то ECL ругается на то, что "функция NIL не определена" (ну ещё бы!)
Собсно, я хотел эту штуку применить для того, чтобы программа ругалась бы на неопределённый метод, но продолжала бы выполнение. Пусть и без этого неопределённого метода. Однако же, обход сбоя сбоит сам.
Блин.
С другой стороны, если все вызываемые методы определены (т.е. если программист не шизофреник), то no-applicable-method как бы и не нужен...
Оставил багрепорт. Пусть будет таким мой посильный вклад!