Портативный, чтобы использовать make-instance для создания условий? - PullRequest
0 голосов
/ 02 августа 2020

В Common Lisp переносимо ли использовать make-instance вместо make-condition для создания объектов условий?

Например:

(define-condition foo (condition)
  ())

(make-condition 'foo)
(make-instance 'foo)

Это как-то связано с как условия размещаются в иерархии классов CLOS? (subtypep 'condition 'standard-class) возвращает false в SBCL и CLISP. Однако make-instance может создавать условия в обеих реализациях. Гарантировано ли это стандартом?

Ответы [ 3 ]

4 голосов
/ 02 августа 2020

Это не переносимо, согласно 4-й сноске в главе 19 Практического Common Lisp:

"В некоторых реализациях Common Lisp условия определены как подклассы STANDARD-OBJECT, и в этом случае SLOT -VALUE, MAKE-INSTANCE и INITIALIZE-INSTANCE будут работать, но на них нельзя полагаться. "

Ссылка на конкретную страницу:

http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html

3 голосов
/ 02 августа 2020

Нет, это явно не переносимо. Из спецификации :

Соответствующий код должен соблюдать следующие ограничения, связанные с условиями:

  • define-condition, а не defclass, должно быть используется для определения новых типов условий.
  • make-condition, а не make-instance, должны использоваться для явного создания объектов условий.
  • Параметр :report для define-condition, а не defmethod для print-object необходимо использовать для определения репортера условий.
  • slot-value, slot-boundp, slot-makunbound и with-slots не должны использоваться для объектов условий. Вместо этого следует использовать соответствующие функции доступа (определяемые define-condition)
2 голосов
/ 02 августа 2020

Вы можете проверить, использует ли система условий в определенной реализации CLOS и поддерживает ли операции CLOS не

(subtypep 'condition 'standard-class)

, а, возможно, используя что-то вроде:

(subtypep (class-of (find-class 'condition)) 'standard-class)

The Common Стандарт Lisp не требует, чтобы реализации использовали CLOS для реализации условий . Таким образом, система условий в стандарте определена без поддержки CLOS: поддержка make-instance не требуется, поддержка создания подклассов через defclass не требуется, ... Таким образом, можно также не рассчитывать на использование других функций CLOS.

Это одна из проблем стандарта Common Lisp с 1994 года.

...