我正在写一些方法来为各种元素发送HTML。每种方法具有相同的输出,但不一定需要相同的输入。defgeneric中的可选参数?
回送一个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章节和some CLOS tutorials,但他们没有涵盖我在这里问的情况)。
对泛型的函数调度似乎不太令人满意(这会使我回到'echo-board' /'echo-space'/etc。地区)。在这种情况下,我认为你是对的。我可能会更好地定义诸如'echo'(天真地输出单个项目)和单独的'echo-tailored'或类似的(其将基于附加参数改变其输出)之类的东西。 – Inaimathi 2012-02-20 19:27:56
非泛型函数不会进行分派,它只是对参数进行规范化。这显然要求泛型(以及方法)采用所有可能的参数,这就是为什么只有当接口实际上相似时才有用。 – Ramarren 2012-02-21 05:39:34
这是Keene的书的PDF(我不知道这是多么合法,请告知):https://doc.lagout.org/programmation/Lisp/Object-Oriented%20Programming%20in%20Common%20Lisp_% 20A%20Programmer%-27%20Guide%20to%20CLOS%20%5BKeene%201989-01-11%5D.pdf – 2017-07-28 23:56:35