Common lisp 泛型函数找不到适用的方法
当我调用(draw win)时,我得到一个错误“泛型函数找不到适用的方法。我刚刚进入CLOS,我正在使用sdl2kit简单地渲染一个窗口Common lisp 泛型函数找不到适用的方法,common-lisp,sdl-2,sbcl,clos,Common Lisp,Sdl 2,Sbcl,Clos,当我调用(draw win)时,我得到一个错误“泛型函数找不到适用的方法。我刚刚进入CLOS,我正在使用sdl2kit简单地渲染一个窗口 (defclass game-window (kit.sdl2:window) ((rotation :initform 0.0))) (defmethod render ((win game-window)) (with-slots (rotation) win (gl:load-identity) (gl:rotate rotation 0 0
(defclass game-window (kit.sdl2:window)
((rotation :initform 0.0)))
(defmethod render ((win game-window))
(with-slots (rotation) win
(gl:load-identity)
(gl:rotate rotation 0 0 1)
(gl:clear-color 0.0 0.0 1.0 1.0)
(gl:clear :color-buffer)
(gl:begin :triangles)
(gl:color 1.0 0.0 0.0)
(gl:vertex 0.0 1.0)
(gl:vertex -1.0 -1.0)
(gl:vertex 1.0 -1.0)
(gl:end)))
(defgeneric draw(win)
(:documentation "draw window"))
(defun main ()
(let (( win (make-instance 'game-window)))
(draw win)))
所以有两个问题。一个是英语语言问题(你必须非常小心,因为每个英语单词都有多种编程含义。例如,当你写“call”时,不清楚你是指“name”还是“invoke/apply”。),但这并不重要 另一个问题是您不知道泛型函数是什么。下面是一个快速解释 泛型函数(大致)有三个部分:
nil
)周围的方法
之前的方法
调用下一个方法设置适当的方法链)
)之后的方法
周围的方法返回
和或progn
或append
要将方法添加到泛型函数的方法集中,通常使用与泛型函数同名的
defmethod
,代码仅具有泛型函数的定义,但这本身不会起任何作用。您还需要为GAME-WINDOW
定义专门化该方法的方法我已经阅读了这一页,但我仍然无法理解这本书的示例。我认为defgeneric将根据specializer调用一个方法。我认为我的渲染方法已经有了“游戏窗口”专门化“win”和render((win game window))。我认为我的渲染方法已经有了“游戏窗口”专门化“win”“使用渲染((赢得游戏窗口))。你是不是把绘图
和渲染
搞混了?您确实为render
定义了一个方法,但是draw
的DEFGENERIC
没有调用任何东西。它定义了一个泛型函数,在本例中是一个名为DRAW
,可以通过定义方法(就像您对RENDER
)对不同类型的参数进行专门化。很简单:一个泛型函数可以通过不同的方法进行专门化。每个方法的命名都与泛型函数类似,但由于其特殊化器(参数类型)和限定符(前后、前后等),它与泛型函数的其他方法不同。现在,当您在没有以前的defgeneric的情况下发出defmethod时,将自动定义泛型函数。