сравнение объектов CLOS

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

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

* Я заметил, что есть связанный вопрос (Использование Common Lisp CLOS-объекты как ключи в хеш-таблице?), однако на самом деле это не отвечает на мой вопрос.

Спасибо и ура!

M


person marleynoe    schedule 18.07.2016    source источник
comment
См., например: nhplace.com/kent/PS/EQUAL.html.   -  person Rainer Joswig    schedule 19.07.2016
comment
Обычно, если вы сравниваете два объекта, вы либо хотите проверить, являются ли они одним и тем же объектом, что вы можете сделать с помощью EQ (также работает с хеш-таблицами), либо вы хотите проверить, равен ли конкретный слот, что, естественно, требует вам написать свою собственную функцию сравнения.   -  person jkiiski    schedule 19.07.2016
comment
С небольшим количеством MOP вы можете написать общий тест на равенство, скажем, EQUAL?, который выполняет EQUALP для всего, кроме экземпляров классов (то есть STANDARD-OBJECT), и выполняет EQUAL? для всех слотов (конечно, вы должны сначала проверить, принадлежат ли объекты к одному и тому же классу, а слоты граница). Медленно, но наверное то, что вы хотите в 99% случаев,   -  person mobiuseng    schedule 19.07.2016
comment
Что плохого в том, чтобы просто использовать EQ, который возвращает true, если его аргументы являются одним и тем же идентичным объектом?   -  person Student    schedule 19.05.2020


Ответы (1)


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

Обратите внимание, что equalp работает с structure-object так, как вы ожидаете. Также обратите внимание, что структуры имеют удобочитаемый синтаксис печати, а объекты CLOS его не имеют.

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

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

person sds    schedule 18.07.2016