동등성과 동일성

리스펙스는 원자·동일성 동등성(`eq?`, `eqv?`), 깊은 구조 동등성(`equal?`), 수치 동등성(`=`)을 분리합니다.

언제 필요한가요?

습관이 아니라 의도에 따라 동등성을 고르세요. 수에는 수학적 동등성, 원자 값이나 같은 집합 객체에는 동일성 계열, 데이터 구조에는 깊은 동등성이 맞습니다.

실행으로 확인하기

LISPEX
(list (= 2 2.0) (eqv? 2 2.0) (equal? (list 1 2) (list 1 2)))

관측 결과

OUTPUT
(#t #f #t)

예제 읽기

=는 정확수 2와 부정확수 2.0을 같은 수학적 수로 봅니다. eqv?는 정확성 차이를 보존합니다. 따로 만든 두 리스트는 같은 객체가 아니지만 equal?은 같은 내용을 확인합니다.

이 순서로 생각하세요

  • 이 프로필에서 eq?eqv?는 원자에 대해 같고 집합은 동일성으로 비교합니다.
  • eqv?equal?는 정확성에 민감하여 정확 2와 부정확 2.0은 다릅니다.
  • equal?는 순환 탐지와 함께 쌍, 벡터, 바이트벡터, 문자열을 깊게 비교합니다.

빠르게 고르기

술어쓸 때집합 값 동작
=수의 수학적 동등성수가 아니면 도메인 오류
eq?원자 값과 객체 동일성같은 집합 객체만 참
eqv?정확성에 민감한 원자 값과 동일성같은 집합 객체만 참
equal?중첩 데이터 내용순환에서도 끝나는 재귀 구조 비교
== / !=읽기 쉬운 구조 비교 별칭equal?과 그 부정

흔한 오해

=는 수만 받으며 ==, !=는 구조적 별칭입니다.

현재 경계

  • 프로시저 동등성은 본문을 구조적으로 비교하지 않습니다.

다음으로

어떤 값이 동일성을 갖는지는 데이터 타입에서, 별도 객체를 만드는 생성자는 집합 프로시저에서 확인하세요.

데이터 타입 · 집합 프로시저