Estoy escribiendo algunos métodos para emitir HTML para varios elementos. Cada método tiene el mismo resultado, pero no necesariamente necesita la misma entrada.Argumentos opcionales en defgeneric?
El método para Haciéndose eco de un game-board
necesidades para tomar una player
también (debido a que cada jugador sólo ve sus propias piezas)
(defmethod echo ((board game-board) (p player)) ...)
Haciéndose eco de un espacio en la placa No es necesario cambiar por jugador (que es en realidad el envío hecho en el método game-board
, que más tarde llama al echo
en un espacio). Idealmente, me gustaría ser capaz de hacer
(defmethod echo ((space board-space)) ...)
(defmethod echo ((space empty-space)) ...)
También es concebible que más tarde me encuentro con un objeto que se necesita saber más que el jugador con el fin de mostrar por sí mismo adecuadamente. Dado que ya hay métodos que se especializan en el mismo genérico, sin embargo, que darían el error
The generic function #<STANDARD-GENERIC-FUNCTION ECHO (4)> takes 2 required arguments;
Parece menos que ideal para volver y nombrar estos métodos echo-space
, echo-board
y así sucesivamente.
¿Existe alguna manera canónica de variar otros argumentos basados en el objeto especializado? ¿Debo hacer algo como
(defgeneric echo (thing &key player ...) ...)
o
(defgeneric echo (thing &rest other-args) ...)
? De manera más general, ¿alguien puede indicarme un tutorial decente en defgeneric
específicamente? (He leído los capítulos PCL relevantes y some CLOS tutorials, pero no cubren la situación que estoy preguntando aquí).
Tener un despacho de función en un genérico parece poco satisfactorio (eso me llevaría de regreso a 'eco-board' /' echo-space'/etc. Territory). Creo que tienes razón en este caso; Sería mejor que definiera algo como 'echo' (para producir elementos individuales ingenuamente) y un' echo-tailored' separado (o similar) (que cambiaría su salida en función de parámetros adicionales). – Inaimathi
La función no genérica no despacha, simplemente canonicaliza los argumentos. Obviamente, esto requiere que los métodos genéricos (y los métodos) tomen todos los argumentos posibles, por lo que esto es útil solo cuando la interfaz es realmente similar. – Ramarren
Aquí hay un PDF del libro de Keene (no sé qué tan legal es esto, por favor asesorar): https://doc.lagout.org/programmation/Lisp/Object-Oriented%20Programming%20in%20Common%20Lisp_% 20A% 20Programador% 27s% 20Guía% 20to% 20CLOS% 20% 5BKeene% 201989-01-11% 5D.pdf –