2016-07-18 2 views
1

CLOS 오브젝트 (표준 클래스)를 비교하기 위해 Common Lisp에 내장 된 항등 연산자가없는 이유가 궁금합니다. 예를 들어, "equalp"는 배열, 구조체, 해시 테이블에 적용될 수 있지만 객체에는 적용될 수 없습니다.CLOS 오브젝트 비교

나는 객체를 강하하고 슬롯 값이 equalp가 프로그래머에 의해 쓰여질 수 있는지를 검사하지만, 표준에 포함되지 않는 이유가 있는지 궁금하다. 할 공통점은? 예를 들어, "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' (해시 테이블과 함께 작동), 또는 특정 슬롯이 동일한 지 확인하고 싶다면 당연히 자신 만의 비교 함수를 작성해야합니다. – jkiiski

+0

MOP을 사용하면 클래스 인스턴스 (예 :'STANDARD-OBJECT')를 제외한 모든 것에 대해'EQUALP'를 수행하고 모든 슬롯에서'EQUAL? '을 수행하는 일반적인 동등성 테스트를 작성할 수 있습니다 객체가 같은 클래스에 먼저 속하고 바운드가 있는지 확인해야합니다. 천천히,하지만 아마도 당신이 원하는 건 99 %의 경우에, – mobiuseng

답변

2

나는 확실한 대답을 제공 할 수 없다,하지만 난 그 이유의 일부가 histerical 것으로 의심 : CLOS는 equalp의 사양이 확정 된 후 ANSI CL 에 추가 된 .

equalp은 예상대로 structure-object에 적용됩니다. 구조체에는 readable print syntax 이 있고 CLOS objects에는 구조체가 없습니다.

그러나 이것은 처음에 생각할 수있는 큰 감시가 아닐 수도 있습니다.

CLOS 객체는 상대적으로 중량이 클 수 있습니다. 주어진 slot accessorsgeneric functions입니다. 은 개체 평등을 파악하면 기능을 비교하는 데 신속하게 적용될 수 있습니다.