2012-04-04 5 views
1

Хотя в общем случае это не имеет особого смысла, так как это должно быть сделано через суперклассы, я хочу разрешить «nil» для определенного параметра и избежать необходимости определять отдельный метод.В определениях CLOS-метода может ли специализатор быть списком классов, а не одним классом?

Я пытаюсь сделать что-то вроде этого (псевдо-код)

(defmethod my-method ((obj1 my-class1) (obj2 (or my-class2 null))) 
    method-body  ) 
+1

Во избежание многократного дублирования кода вы можете [1] написать макрос, который пишет кучу defmethods, или [2] использовать надписи над шаблоном defmethod; сохранить код метода внутри функции меток, а затем определить несколько методов, которые могут получить доступ к этой функции (закрытие defmethod) –

ответ

3

Это не поддерживается в простом CLOS.

Поддерживаются:

  • не класс -> T
  • EQL
  • один класс
0

Вы можете создать класс подмешать, без щелей и добавить, что суперкласса список все классы интересов; это имеет смысл, потому что то, что вы делаете, подразумевает, что все классы в вашем списке соответствуют некоторому типу.

В качестве альтернативы не специализируйтесь - напишите метод, который применим к надмножеству типов интересов, но действует только на ваш поднабор. Это может быть легче сделать, но менее чисто.