Error handling 可移植到使用make实例生成条件?
在Common Lisp中,是否可以使用Error handling 可移植到使用make实例生成条件?,error-handling,common-lisp,clos,Error Handling,Common Lisp,Clos,在Common Lisp中,是否可以使用make instance而不是make condition来生成条件对象 例如: (define-condition foo (condition) ()) (make-condition 'foo) (make-instance 'foo) 这是否与CLOS类层次结构中条件的放置方式有关(子类“条件”标准类)在SBCL和CLISP中返回false。但是,make instance可以在两种实现中生成条件。该标准是否保证了这一点?根据实用通用Li
make instance
而不是make condition
来生成条件对象
例如:
(define-condition foo (condition)
())
(make-condition 'foo)
(make-instance 'foo)
这是否与CLOS类层次结构中条件的放置方式有关<代码>(子类“条件”标准类)在SBCL和CLISP中返回false。但是,
make instance
可以在两种实现中生成条件。该标准是否保证了这一点?根据实用通用Lisp第19章第4个脚注,它是不可移植的:
在一些常见的Lisp实现中,条件被定义为STANDARD-OBJECT的子类,在这种情况下,SLOT-VALUE、MAKE-INSTANCE和INITIALIZE-INSTANCE可以工作,但依赖它是不可移植的
链接到特定页面:
不,这样做显然是不可移植的。从: 符合性规范必须遵守以下与条件相关的限制:
- 必须使用
,而不是define condition
,来定义新的条件类型defclass
- 必须使用
,而不是生成条件
,来显式创建条件对象生成实例
- 必须使用
定义条件的
选项,而不是:report
打印对象的
,来定义条件报告器defmethod
、slot value
、slot boundp
、以及带有slot的slot makunbund
不能用于条件对象。相反,应使用适当的访问器函数(由
定义)定义条件
您可以检查特定实现中的条件系统是否正在使用CLOS并支持CLOS操作
(subtypep 'condition 'standard-class)
但也许可以使用以下方法:
(subtypep (class-of (find-class 'condition)) 'standard-class)
公共Lisp标准不要求实现使用CLO来实现条件。因此,标准中的条件系统在不支持CLO的情况下定义:不支持make instance
required,不支持通过defclass
创建子类required。。。因此,我们也不能指望正在使用的CLO的其他特性
这是1994年通用Lisp标准的缺点之一