갈루아의 반서재


먼저 심볼간의 비교에는 eq 를 사용한다.

1
2
3
4
[12]> (defparameter *fruit* 'apple)
*FRUIT*
[12]> (cond ((eq *fruit* 'apple) 'its-an-apple))
ITS-AN-APPLE
cs


2개의 심볼을 비교하는 게 아니라면 equal 을 사용해라. 이 명령어는 서로 동형인지를 판단해준다. 

1) 심볼 및 리스트 비교

1
2
3
4
[13]> (equal 'apple 'apple)
T
[13]> (equal (list 1 2 3) (list 1 2 3))
T
cs

2) 다른 방식으로 생성된 리스트 간 비교도 가능

1
2
3
4
Break 26 [27]> (cons 1 (cons 2 (cons 3 ())))
(1 2 3)
Break 26 [27]> (equal '(1 2 3) (cons 1 (cons 2 (cons 3 ()))))
T
cs

3) 정수, 실수간 비교

1
2
3
4
Break 27 [28]> (equal 5 5)
T
Break 27 [28]> (equal 2.5 2.5)
T
cs

4) 문자열 및 문자 비교

1
2
3
4
Break 28 [29]> (equal "foo" "foo")
T
Break 28 [29]> (equal #\a #\a)
T
cs

보는 바와 같이, 리스프의 대부분의 아이템은 equal 을 통해 효과적으로 비교가 가능하다. 


eq 와 상당히 유사하지만, 그와는 다르게 수와 문자간의 비교가 가능한 eql 에 대해 알아보자. 심볼 뿐만 아니라 수와 문자간 비교도 가능하다.

1
2
3
4
5
6
7
8
Break 29 [30]> (eql 'foo 'foo)
T
Break 29 [30]> (eql 3.4 3.4)
T
Break 29 [30]> (eql #\a #\a)
T
Break 29 [30]>
 
cs


그리고 equal과 유사한 equalp 라는 명령어도 있다. 다음의 예를 보자. equalp는 대문자 사용방식이 다른 경우 및 정수와 실수간 비교가 가능하다. 

1
2
3
4
5
6
7
 
Break 30 [31]> (equalp "Bob Smith" "bob smith")
T
Break 30 [31]>  (equalp 0 0.0)
T
Break 30 [31]>
 
cs