동등성과 동일성

리스펙스는 세 가지 동등성을 구분합니다. 원자·동일성 동등성은 `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?과 그 부정

흔한 오해

=는 수만 받습니다. ==!=는 구조 비교의 별칭입니다.

현재 경계

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

다음으로

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

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