Мне интересно, почему в Common Lisp нет встроенного оператора равенства для сравнения объектов CLOS (стандартных классов). Например, «equalp» может применяться к массивам, структурам, хеш-таблицам, но не к объектам.Сравнение объектов CLOS
Я предполагаю, что новый тест, который сбрасывает объект и проверяет, могут ли слова равные p быть записаны программистом, но мне интересно, есть ли причина, по которой это не является частью стандарта, так как я полагаю, что это довольно обычная вещь? Например, кажется, что тестовые функции для «make-hash-table» должны быть одним из встроенных *, поэтому я не вижу, как использовать объекты в качестве ключей или значений в хэш-таблице.
* Я заметил, что есть связанный с этим вопрос (Using Common Lisp CLOS objects as keys in a hashtable?), однако на самом деле он не отвечает на мой вопрос.
Спасибо и приветствую!
M
См. Например: http://www.nhplace.com/kent/PS/EQUAL.html –
Обычно, если вы сравниваете два объекта, вы либо хотите проверить, являются ли они одним и тем же объектом, что вы можете сделать с 'EQ' (также работает с hashtables), или вы хотите проверить, равен ли определенный слот, что, естественно, требует от вас написать собственную функцию сравнения. – jkiiski
С небольшим количеством MOP вы можете написать общий тест равенства, например 'EQUAL?', Который выполняет 'EQUALP' на все, кроме экземпляров экземпляров (например,« STANDARD-OBJECT'), и «EQUAL?» На всех слотах (конечно вы должны проверить, принадлежат ли объекты одному классу, а слоты - границам). Медленный, но, вероятно, то, что вы хотите в 99% случаев, – mobiuseng