Chapter 11 练习 (Exercises)
- 替图 11.2 所定义的类定义访问器、 initforms 以及 initargs 。重写相关的代码使其再也不用调用
slot-value
。 - 重写图 9.5 的代码,使得球体与点为类别,而
intersect
及normal
为通用函数。 - 假设有若干类别定义如下:
(defclass a (c d) ...) (defclass e () ...)
(defclass b (d c) ...) (defclass f (h) ...)
(defclass c () ...) (defclass g (h) ...)
(defclass d (e f g) ...) (defclass h () ...)
- 画出表示类别
a
祖先的网络以及列出a
的实例归属的类别,从最相关至最不相关排列。 替类别
b
也做 (a) 小题的要求。假定你已经有了下列函数:
precedence
:接受一个对象并返回其优先级列表,列表由最具体至最不具体的类组成。
methods
:接受一个通用函数并返回一个列出所有方法的列表。
specializations
:接受一个方法并返回一个列出所有特化参数的列表。返回列表中的每个元素是类别或是这种形式的列表 (eql x)
,或是 t
(表示该参数没有被特化)。
使用这些函数(不要使用 compute-applicable-methods
及 find-method
),定义一个函数 most-spec-app-meth
,该函数接受一个通用函数及一个列出此函数被调用过的参数,如果有最相关可用的方法的话,返回它。
- 不要改变通用函数
area
的行为(图 11.2), - 举一个只有通用函数的第一个参数被特化会很难解决的问题的例子。
脚注
[1] | Initarg 的名称通常是关键字,但不需要是。 |
[2] | 我们不可能比较完所有的参数而仍有平手情形存在,因为这样我们会有两个有着同样特化的方法。这是不可能的,因为第二个的定义会覆写掉第一个。 |
当前内容版权归 readthedocs 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 readthedocs .