Chapter 11 练习 (Exercises)

  1. 替图 11.2 所定义的类定义访问器、 initforms 以及 initargs 。重写相关的代码使其再也不用调用 slot-value
  2. 重写图 9.5 的代码,使得球体与点为类别,而 intersectnormal 为通用函数。
  3. 假设有若干类别定义如下:
  1. (defclass a (c d) ...) (defclass e () ...)
  2. (defclass b (d c) ...) (defclass f (h) ...)
  3. (defclass c () ...) (defclass g (h) ...)
  4. (defclass d (e f g) ...) (defclass h () ...)
  1. 画出表示类别 a 祖先的网络以及列出 a 的实例归属的类别,从最相关至最不相关排列。
  2. 替类别 b 也做 (a) 小题的要求。

  3. 假定你已经有了下列函数:

precedence :接受一个对象并返回其优先级列表,列表由最具体至最不具体的类组成。

methods :接受一个通用函数并返回一个列出所有方法的列表。

specializations :接受一个方法并返回一个列出所有特化参数的列表。返回列表中的每个元素是类别或是这种形式的列表 (eql x) ,或是 t (表示该参数没有被特化)。

使用这些函数(不要使用 compute-applicable-methodsfind-method ),定义一个函数 most-spec-app-meth ,该函数接受一个通用函数及一个列出此函数被调用过的参数,如果有最相关可用的方法的话,返回它。

  1. 不要改变通用函数 area 的行为(图 11.2),
  2. 举一个只有通用函数的第一个参数被特化会很难解决的问题的例子。

脚注

[1]Initarg 的名称通常是关键字,但不需要是。
[2]我们不可能比较完所有的参数而仍有平手情形存在,因为这样我们会有两个有着同样特化的方法。这是不可能的,因为第二个的定义会覆写掉第一个。