Common lisp 泛型函数找不到适用的方法

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

当我调用(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 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”。),但这并不重要

另一个问题是您不知道泛型函数是什么。下面是一个快速解释

泛型函数(大致)有三个部分:

  • lambda列表
  • 方法组合
  • 一套方法
  • 方法有三个部分

  • 专门的lambda列表
  • 一些代码
  • 与方法组合相关的内容(通常
    nil
  • 调用泛型函数时,会发生以下情况:

  • 它查看参数的类型
  • 各种规则被应用于按特定性对方法进行排序
  • 方法组合说明了如何将这些组合成一个函数
  • 生成并编译组合函数的代码
  • 使用参数调用生成的函数
  • 步骤2-4通常是缓存的

    步骤3大致有两种形式:

  • 标准方法组合:
  • 调用所有
    周围的
    方法
  • 然后是所有
    之前的
    方法
  • 调用最具体的方法(为
    调用下一个方法设置适当的方法链)
  • 然后是所有
    之后的
    方法
  • 结果通过所有
    周围的
    方法返回
  • 其他方法组合通常将所有方法的结果应用于某些运算符,如
    progn
    append

  • 要将方法添加到泛型函数的方法集中,通常使用与泛型函数同名的
    defmethod
    ,代码仅具有泛型函数的定义,但这本身不会起任何作用。您还需要为
    GAME-WINDOW
    定义专门化该方法的方法我已经阅读了这一页,但我仍然无法理解这本书的示例。我认为defgeneric将根据specializer调用一个方法。我认为我的渲染方法已经有了“游戏窗口”专门化“win”和render((win game window))。我认为我的渲染方法已经有了“游戏窗口”专门化“win”“使用渲染((赢得游戏窗口))。你是不是把
    绘图
    渲染
    搞混了?您确实为
    render
    定义了一个方法,但是
    draw
    DEFGENERIC
    没有调用任何东西。它定义了一个泛型函数,在本例中是一个名为
    DRAW
    ,可以通过定义方法(就像您对
    RENDER
    )对不同类型的参数进行专门化。很简单:一个泛型函数可以通过不同的方法进行专门化。每个方法的命名都与泛型函数类似,但由于其特殊化器(参数类型)和限定符(前后、前后等),它与泛型函数的其他方法不同。现在,当您在没有以前的defgeneric的情况下发出defmethod时,将自动定义泛型函数。