Указание типа аргументов ключевых слов в методах Common Lisp - PullRequest
0 голосов
/ 23 октября 2019

Я думал, что смогу определить метод, который принимает аргументы ключевых слов. Но когда у меня есть несколько методов с аргументами ключевых слов разных типов, кажется, что lisp использует последний оцененный метод. Например, ниже:

(defmethod f (&key (x list)) (make-list 3 :initial-element (first x)))
(defmethod f (&key (x number)) (* 2 x))

Теперь f :x принимает только цифры и выдает ошибки для списков:

(f :x 2)                ;4

, но

(f :x '(2))

Значение (2) не относится к типу NUMBER при связывании SB-KERNEL :: X [Условие типа TYPE-ERROR]

Как определить несколько методов с & ключевыми аргументами разных типов

1 Ответ

3 голосов
/ 24 октября 2019

Возможна отправка только по требуемым позиционным параметрам. Любые параметры &optional, &key, &rest и &aux работают только так, как в обычных лямбда-списках.

Из-за этого ваше второе определение не отличалось в диспетчерской части и переписало существующий метод,Я также считаю, что ваш пример должен был выдавать предупреждения о том, что list и number являются несвязанными переменными.

...