Я пишу несколько методов для генерации HTML для различных элементов. Каждый метод имеет одинаковый вывод, но не обязательно требует одинакового ввода.
Метод вывода game-board
также должен принимать player
(поскольку каждый игрок видит только свои фигуры)
(defmethod echo ((board game-board) (p player)) ... )
Чтобы получить доступ к пространству на доске, не нужно менять каждого игрока (эта диспетчеризация на самом деле выполняется методом game-board
, который позже вызывает echo
в пространстве). В идеале я бы смог сделать
(defmethod echo ((space board-space)) ... )
(defmethod echo ((space empty-space)) ... )
Также возможно, что позже я столкнусь с объектом, который должен знать больше, чем просто игрок, чтобы правильно отобразить себя. Поскольку уже существуют методы, специализирующиеся на одном и том же универсальном, это может привести к ошибке
The generic function #<STANDARD-GENERIC-FUNCTION ECHO (4)> takes 2 required arguments;
Кажется, не совсем идеально возвращаться и называть эти методы echo-space
, echo-board
и так далее.
Есть ли канонический способ варьирования других аргументов на основе специализированного объекта? Должен ли я сделать что-то вроде
(defgeneric echo (thing &key player ...) ...)
или
(defgeneric echo (thing &rest other-args) ...)
? В более общем плане, кто-нибудь может указать мне на достойное руководство по defgeneric
конкретно? (Я прочитал соответствующие главы PCL и некоторые CLOS учебные пособия , но они не охватывают ситуацию, о которой я здесь спрашиваю).