Необязательные аргументы в defgeneric?

Я пишу несколько методов для вывода HTML для различных элементов. Каждый метод имеет одинаковые выходные данные, но не обязательно требует одинаковых входных данных.

Метод отображения игрового поля также требует использования игрока (потому что каждый игрок видит только свои фигуры).

(defmethod echo ((board game-board) (p player)) ... )

Отображение поля на доске не требуют изменения для каждого игрока (эта отправка фактически выполняется в методе game-board , который позже вызывает echo для пробела). В идеале я мог бы сделать

(defmethod echo ((space board-space)) ... )
(defmethod echo ((space empty-space)) ... )

Также возможно, что позже я столкнусь с объектом, которому нужно будет знать больше, чем просто игрок, чтобы правильно отобразить себя. Однако, поскольку уже существуют методы, специализирующиеся на одном и том же универсальном методе, это дало бы ошибку

The generic function # takes 2 required arguments;

. Кажется не идеальным вернуться назад и назвать эти методы echo-space , echo-board и так далее.

Существует ли канонический способ изменения других аргументов на основе специализированного объекта? Что делать, например,

(defgeneric echo (thing &key player ...) ...)

или

(defgeneric echo (thing &rest other-args) ...)

? В более общем плане, может ли кто-нибудь указать мне на достойное руководство по defgeneric в частности? (Я прочитал соответствующие главы PCL и некоторые CLOS руководства , но они не охватывают ситуацию, о которой я спрашиваю здесь).

8
задан Inaimathi 20 February 2012 в 14:00
поделиться