通用功能无法找到适用的方法

时间:2017-02-17 16:30:57

标签: common-lisp sdl-2 sbcl clos

当我调用(绘制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)))

1 个答案:

答案 0 :(得分:0)

所以有两个问题。一个是英语问题(您必须格外小心,因为每个英语单词都带有多种编程含义,例如,当您编写“ call”时,并不清楚是“ name”还是“ invoke / apply”。)但这并不重要

另一个问题是您不知道通用函数是什么。这是一个快速的解释器。

泛型函数大致包括三个部分:

  1. lambda列表
  2. 方法组合
  3. 一组方法

一种方法包括三个部分

  1. 特殊的lambda列表
  2. 某些代码
  3. 与方法组合有关的事物(通常为nil

调用泛型函数时会发生这种情况:

  1. 它查看参数的类型
  2. 应用各种规则对方法进行排序
  3. 方法组合说明如何将它们组合成一个函数
  4. 组合函数的代码已生成并编译
  5. 使用参数调用生成的函数。

通常会缓存步骤2-4。

第3步大致有两种形式:

  1. 标准方法组合:
    1. 所有around方法都被调用
    2. 然后使用所有before方法
    3. 调用了大多数特定的方法(并为call-next-method设置了适当的方法链)
    4. 然后使用所有after方法
    5. 通过所有around方法返回结果
  2. 其他方法组合通常将所有方法的结果应用于andprognappend之类的运算符。

要将方法添加到泛型函数的方法集中,通常使用defmethod,其名称与泛型函数相同