같은지 비교하기

equal?로 내용을 비교하고, eq?로 같은 객체인지 확인하고, =로 수를 비교합니다.

리스트나 벡터의 내용은 equal?로 비교하고, 같은 객체인지는 eq?로 확인하세요. 수를 비교할 때는 =를 씁니다. 내용이 같은지를 동등성, 같은 객체인지를 객체 동일성이라고 부릅니다.

두 리스트 비교하기

이 예제를 플레이그라운드에 붙여 넣고 실행하세요.

LISPEX
(define xs (list 1 2))
(define same xs)
(define other (list 1 2))
(list (equal? xs other) (eq? xs other) (eq? xs same))

결과

출력
(#t #f #t)

xs와 other는 따로 만든 리스트를 가리킵니다. 원소가 같으므로 equal?의 결과는 #t입니다. 서로 다른 객체이므로 eq?의 결과는 #f입니다.

same은 xs에 저장된 리스트를 그대로 가리킵니다. 둘을 eq?로 비교하면 #t가 나옵니다. 이처럼 같은 객체를 가리키는지를 객체 동일성이라고 합니다.

수 비교하기

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

결과

출력
(#t #f #t)

=는 정확수 2와 부정확수 2.0을 수학적으로 같은 수로 봅니다. eqv?는 정확수와 부정확수를 구별하므로 #f를 돌려줍니다.

equal?도 정확수와 부정확수를 구별하며, 리스트 안의 수에도 같은 규칙을 적용합니다. 마지막 비교에서는 두 리스트에 같은 정확 정수가 들어 있으므로 #t가 나옵니다.

비교 프로시저 고르기

술어는 질문에 #t나 #f로 답하는 프로시저입니다.

술어비교하는 것
=수의 수학적 값, 다른 타입을 주면 오류
eq? / eqv?원자 값은 수의 정확성을 구별해 비교하고, 복합 값은 객체 동일성을 비교
equal?쌍, 벡터, 바이트벡터, 문자열의 내용, 안에 든 값도 차례로 비교
== / !=equal?와 같음 / equal?의 반대 결과

여기서 원자 값은 수, 문자, 불리언, 심볼, 빈 리스트를 뜻합니다. 현재 언어 프로파일에서 eq?와 eqv?는 같은 결과를 냅니다.

equal?는 안쪽 값을 비교하면서 순환을 탐지합니다. 구조가 자기 자신을 다시 가리켜도 비교는 끝납니다. 프로시저는 equal?를 쓸 때도 객체 동일성으로 비교하며, 본문은 비교하지 않습니다.

관련 문서

데이터와 복합 값에서 용도에 맞는 값을 고르세요. 값을 만들고 벡터의 내용을 바꾸는 방법은 리스트와 복합 값 프로시저에 있습니다.