Error handling 可移植到使用make实例生成条件?

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

在Common Lisp中,是否可以使用
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 makunbund
    、以及带有slot
    不能用于条件对象。相反,应使用适当的访问器函数(由
    定义条件
    定义)

您可以检查特定实现中的条件系统是否正在使用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标准的缺点之一