2016-07-18 2 views
1

Мне интересно, почему в Common Lisp нет встроенного оператора равенства для сравнения объектов CLOS (стандартных классов). Например, «equalp» может применяться к массивам, структурам, хеш-таблицам, но не к объектам.Сравнение объектов CLOS

Я предполагаю, что новый тест, который сбрасывает объект и проверяет, могут ли слова равные p быть записаны программистом, но мне интересно, есть ли причина, по которой это не является частью стандарта, так как я полагаю, что это довольно обычная вещь? Например, кажется, что тестовые функции для «make-hash-table» должны быть одним из встроенных *, поэтому я не вижу, как использовать объекты в качестве ключей или значений в хэш-таблице.

* Я заметил, что есть связанный с этим вопрос (Using Common Lisp CLOS objects as keys in a hashtable?), однако на самом деле он не отвечает на мой вопрос.

Спасибо и приветствую!

M

+3

См. Например: http://www.nhplace.com/kent/PS/EQUAL.html –

+2

Обычно, если вы сравниваете два объекта, вы либо хотите проверить, являются ли они одним и тем же объектом, что вы можете сделать с 'EQ' (также работает с hashtables), или вы хотите проверить, равен ли определенный слот, что, естественно, требует от вас написать собственную функцию сравнения. – jkiiski

+0

С небольшим количеством MOP вы можете написать общий тест равенства, например 'EQUAL?', Который выполняет 'EQUALP' на все, кроме экземпляров экземпляров (например,« STANDARD-OBJECT'), и «EQUAL?» На всех слотах (конечно вы должны проверить, принадлежат ли объекты одному классу, а слоты - границам). Медленный, но, вероятно, то, что вы хотите в 99% случаев, – mobiuseng

ответ

2

Я не могу предложить окончательный ответ, но я подозреваю, что часть из причин является histerical: CLOS был добавлен в ANSI CL после спецификация для equalp была завершена.

Отметьте, что equalp работает на structure-object s, как вы ожидаете. Обратите также внимание на то, что структуры имеют readable print syntax , а CLOS objects не хватает.

Однако, возможно, это не такой большой надзор, как можно было бы подумать вначале.

Объекты CLOS могут быть относительно тяжелыми; с учетом того, что slot accessors are generic functions, Определение равенства объектов может быстро перейти к сравнению функций.

Смежные вопросы