; Системная функция '+' является неявным методом;#1
; Данный метод имеет следующее определение:
; (defmethod + {(?a NUMBER) (?b NUMBER) ($?rest NUMBER)))
(defmethod + ((?a NUMBER) (?b INTEGER))); #2
(defmethod + ((?a INTEGER) (?b INTEGER))); #3
(defmethod + ((?a INTEGER) (?b NUMBER))); #4
(defmethod + ((?a NUMBER) (?b NUMBER)
($?rest PRIMITIVE))); #5
(defmethod + ((?a NUMBER) (?b INTEGER (>?b 2)))); #6
(defmethod +((?a INTEGER (>?a 2))
(?b INTEGER (>?b 3))));#7
(defmethod +((?a INTEGER (>?a 2)) (?b NUMBER))); #8
Приоритет методов, в приведенном выше примере, будет следующим: #7, #8, #3, #4, #6, #2, #1, #5. В данной ситуации для определения приоритета методы могут быть сразу разбиты на три группы по уменьшению приоритета с помощью ограничения, заданного для их первого параметра:
Ø методы, которые имеют ограничение и типом и запросом для класса integer (#7', #8);
Ø методы, которые имеют ограничение типа для класса integer (#3, #4);
Ø методы, которые имеют ограничение типа для класса number (#1, #2, #5, #6).
Методы первой группы имеют более высокий приоритет, чем методы второй группы, т. к. ограничение параметров типом и запросом имеет более высокий приоритет, чем ограничение только типом. Вторая группа имеет более высокий приоритет, чем третья группа, поскольку integer является подклассом number. Поэтому порядок методов можно представить так:
(#7, #8) (#3, #4) (#1, #2, #5, #6).
Следующим шагом будет определение приоритета между методами в выделенных нами группах, учитывая ограничение по второму параметру. Метод # 1имеет больший приоритет, чем #8, т. к. integer является подклассом number. Метод #3 имеет больший приоритет по сравнению с #4 по той же причине. Методы #6 и #2 имеют приоритет больший, чем методы #1 и #5, т. к. integer является подклассом number. Метод #6 имеет больший приоритет по сравнению с #2, т. к. #6 имеет ограничение запросом, а #2 нет. Таким образом, порядок методов примет следующий вид: #7, #8, #3, #4, #6, #2, (#1, #5)
Ограничение по групповому аргументу дает методу #1 (системной функции + — неявному методу родовой функции +) больший приоритет по сравнению c методом #5, т.к. number является подклассом primitive. Итак, окончательным порядком расстановки методов по приоритету будет такой: #7, #8, #3, #4, #6, #2, #1, #5.
Пример 10.8. Определение приоритета
(defmethod foo ((?a NUMBER STRING))); #1
(defmethod foo (?a INTEGER LEXEME))); #2
Несмотря на то, что класс string является подклассом класса lexeme, порядок методов будет #2, #1, т. к. integer является подклассом number, а пара number/integer находится левее пары string/lexeme в списке классов.