=, eq, equal

2016.04.02 21:10

리습 함수 중 =, eq, equal 은 비슷하면서 다릅니다.

 

--------------------------------------------------------

(setq a (1+ 2))

(setq b 3)  

 

일 때,

 

(= a b)   : T

(eq a b) : T

(equal a b) : T

 

로 모두 같습니다.

 

--------------------------------------------------------

그러나,

 

(setq a 3)

(setq b 3.1)

 

일 때,

 

(= a b)   : nil

(eq a b) : nil

(equal a b) : nil

(equal b c 0.1) : nil

(equal b c 0.2) : T

 

입니다.

즉 equal 은 오차범위를 지정할 수 있습니다.

 

--------------------------------------------------------

또한

 

(setq a '(a b c))

(setq b '(a b c))

 

일 때,

 

(= a b)   : nil

(eq a b) : nil

(equal a b) : T

 

입니다.

즉, equal 만 리스트의 비교가 가능합니다.

 

--------------------------------------------------------

또한

 

(setq a '(a b c))

(setq b '(a b c))

(setq c b)

 

일 때,

 

(= a c)   : nil

(eq a c) : nil

(equal a c) : T

 

이지만,

 

(= b c)   : T

(eq b c) : T

(equal b c) : T

 

로 나옵니다.

 

조금 헷갈릴 수도 있지만,

위에서 "(setq c b)" 라고 이미 정의를 했기 때문에, 그 내용은 보지도 않고, 같다고 정의를 해놓은 것만 판단하여

 = 이나, eq 나 모두 T 를 반환하는 것입니다.

 

--------------------------------------------------------

또한

 

(setq a '(a b c))

 

일 때,

 

(= a '(a b c))   : nil

(eq a '(a b c)) : nil

(equal a '(a b c)) : T

 

입니다.

즉, 무조건 리스트의 비교는 equal 만 가능한 것을 알 수 있습니다.

 

--------------------------------------------------------

이 것을 보면, = 과 eq 가 완전히 같은 것 같지만..

그렇지 않습니다.

 

(= 1 2 3 4 5)   : nil

(= 1 1 1 1 1)   : T

(eq 1 1 1 1 1) : error 가 난다.

 

즉, = 는 여러개의 숫자를 비교할 수 있습니다.

심지어

 

(= "a" "a" "a" "a")  : T

 

도 가능합니다. 즉 여러개의 숫자, 문자열의 비교가 가능한 것입니다. (리스트 형식이 아님.!!!)

 

이 것을 보면, eq 보다 = 가 같은 기능이면서 더 범위가 넓은 것 처럼 보이지만, 사실 그렇지 않습니다.

 

--------------------------------------------------------

(setq enta (car (entsel)))  

(setq entb (car (entsel)))

 

로, 같은 객체를 선택한 다음..

 

(= enta entb)   : nil

(eq enta entb)   : T

(equal enta entb)   : T

 

로 나옵니다. 즉, 객체 간의 비교 등은 eq 또는 equal 을 사용해야 합니다.

 

--------------------------------------------------------

그러므로, 자신이 스스로 어떤 경우에 어떤 것을 사용하는지의 원칙을 정해서 구문을 짜면 일관성이 있어 마음이 편합니다.

 

저의 경우

 

숫자, 문자의 비교는 =

객체의 비교는 eq

리스트의 비교는 equal

오차범위 내에서의 숫자 비교는 equal 을 사용하고 있습니다.

 

여기서, 이렇게 나누지 말고, 모두 equal 을 사용해도 되는 것 아니냐? 고 하실 듯 한데요..

결과는 같습니다만.. 세가지로 나눈 이유는 아래와 같습니다.

 

1. equal 함수보다, eq 또는 = 함수의 속도가 평균 약 10% 정도 더 빠릅니다.

2. 글자수의 차이로 인해 좀 더 빠르게 구문을 짤 수 있습니다.

3. 글자수의 차이로 인해, 결과 파일의 용량이 줄어 듭니다.

 

 

+ Recent posts