Clozure CL中文版021:CLOS Metaobject协议
Category:帮助手册CLOS Metaobject协议
Clozure CL支持CLOS的大多数半标准元对象协议(MOP),如“元对象协议的艺术”第5章和第6章所定义,(Kiczales等,MIT Press 1991,ISBN 0-262-61074- 4); 该规范也可在http://www.alu.org/mop/index.html在线获取。
值得注意的是缺少对泛型函数调用协议的支持。
关键字:openmcl-partial-mop已启用*features*,表示存在此功能。
MOP规范中定义的所有符号(无论是否实现)都从ccl 包和包中导出openmcl-mop。
MOP实施状态 | ||
构造 | 状态 | |
accessor-method-slot-definition | 存取法槽清晰度 | + |
add-dependent | 添加依赖 | + |
add-direct-method | 加上直接法 | + |
add-direct-subclass | 附加直子 | + |
add-method | 添加法 | + |
class-default-initargs | 类默认initargs | + |
class-direct-default-initargs | 类直接默认initargs | + |
class-direct-slots | 类直接插槽 | + |
class-direct-subclasses | 类的直接子类 | + |
class-direct-superclasses | 类的直接超类 | + |
class-finalized-p | 类敲定-P | + |
class-prototype | 类原型 | + |
class-slots | 类型槽 | + |
compute-applicable-methods | 计算,适用的方法 | – |
compute-applicable-methods-using-classes | 计算,适用的方法,使用类 | – |
compute-class-precedence-list | 计算-类优先级列表 | + |
compute-direct-initargs | 计算,直接initargs | + |
compute-discriminating-function | 计算辨别功能 | – |
compute-effective-method | 计算有效的法 | + |
compute-effective-slot-definition | 计算有效时隙清晰度 | + |
compute-slots | 计算时隙 | + |
direct-slot-definition-class | 直槽清晰度级 | + |
effective-slot-definition-class | 有效时隙清晰度级 | + |
ensure-class | 确保一流 | + |
ensure-class-using-class | 确保一流-使用级 | + |
ensure-generic-function-using-class | 确保泛型函数,使用类 | + |
eql-specializer-object | EQL-专用函数对象 | + |
extract-lambda-list | 提取物 – 拉姆达列表 | + |
extract-specializer-names | 提取-专用函数,名字 | + |
finalize-inheritance | 完成继承 | + |
find-method-combination | 发现法组合 | + |
funcallable-standard-instance-access | funcallable标准实例访问 | + |
generic-function-argument-precedence-order | 通用功能参数的优先级顺序 | + |
generic-function-declarations | 通用的功能,声明 | + |
generic-function-lambda-list | 通用功能 – 拉姆达列表 | + |
generic-function-method-class | 通用功能-方法级 | + |
generic-function-method-combination | 通用功能-方法组合 | + |
generic-function-methods | 通用功能的方法 | + |
generic-function-name | 通用的功能名称 | + |
intern-eql-specializer | 实习生-EQL-专用函数 | + |
make-method-lambda | 化妆方法 – 拉姆达 | – |
map-dependents | 地图家属 | + |
method-function | 法功能 | + |
method-generic-function | 方法泛型功能 | + |
method-lambda-list | 方法 – 拉姆达列表 | + |
method-qualifiers | 方法限定符 | + |
method-specializers | 方法-specializers | + |
reader-method-class | 读写方法级 | + |
remove-dependent | 除去依赖 | + |
remove-direct-method | 除去-直接方法 | + |
remove-direct-subclass | 除去直接子类 | + |
remove-method | 除去法 | + |
set-funcallable-instance-function | 设置funcallable实例功能 | – |
slot-boundp-using-class | 槽boundp-使用级 | + |
slot-definition-allocation | 槽定义分配 | + |
slot-definition-initargs | 槽定义-initargs | + |
slot-definition-initform | 槽定义 – 在initForm | + |
slot-definition-initfunction | 槽定义-initfunction | + |
slot-definition-location | 槽定义定位 | + |
slot-definition-name | 插槽定义名称 | + |
slot-definition-readers | 插槽定义阅读器 | + |
slot-definition-type | 槽定义型 | + |
slot-definition-writers | 槽定义-作家 | + |
slot-makunbound-using-class | 槽makunbound-使用级 | + |
slot-value-using-class | 槽值使用级 | + |
specializer-direct-generic-functions | 专用函数直接泛型函数 | + |
specializer-direct-methods | 专用函数直接的方法 | + |
standard-instance-access | 标准实例访问 | + |
update-dependent | 更新依赖 | + |
validate-superclass | 验证-超 | + |
writer-method-class | 作家方法级 | + |
请注意,上表中状态为“ – ”的那些泛型函数处理泛型函数调度和方法调用(“泛型函数调用协议”)的内部。在Clozure CL中,方法功能与MOP期望的功能略有不同,目前尚不清楚该子协议是否或如何得到良好支持。
上表中标记为“+”的那些构造名义上是按MOP文档指定的那样实现的(与规范的偏差应被视为错误;请报告它们。)请注意一些广泛使用的CLOS实现(例如,PCL) )实现一些东西(ENSURE-CLASS-USING-CLASS浮现在脑海中)与MOP指定的东西略有不同。
并发问题
整个CLOS类和泛型函数层次结构实际上是一个(大型,复杂)共享数据结构; 一个线程请求对所有CLOS的独占访问,以及对CLOS层次结构的意志修改的影响(通过类重新定义,change-class在多线程环境中等)的影响并不总是易于处理。
本机线程加剧了这个问题(因为它们增加了并发修改和访问的机会。)实现应该尝试确保线程对CLOS层次结构的任何子集的视图是一致的(在可能的范围内)并且应该尝试确保层次结构的偶然修改(缓存更新等)以原子方式发生; 实现通常不可能保证线程的事物视图是正确和最新的。
如果您以最常用的方式加载代码并定义类,也就是说,通过编译器,仅使用单个线程,这些问题可能不会对您产生太大影响。
但是,如果您在运行多个操作彼此相关对象的线程时对类层次结构进行了详细的更改,则需要更加小心。在做这样的事情之前,你应该知道自己在做什么,并且已经知道要采取什么预防措施,而不是被告知。也就是说,如果你这样做,你应该认真考虑你的应用程序的关键数据是什么,并对关键代码部分使用锁。
http://mip.i3geek.com