리습 함수 중 =, 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. 글자수의 차이로 인해, 결과 파일의 용량이 줄어 듭니다.
'Lisp & Tips > Lisp' 카테고리의 다른 글
현재 도면에 로딩된 모든 명령어/함수/변수 보기 (0) | 2016.10.17 |
---|---|
vla-get-selectionsets, vla-get-activeselectionset 활용법 (0) | 2016.05.08 |
블럭안의 치수만 지우기 (0) | 2016.02.20 |
vl-every, vl-some 함수 (0) | 2016.02.20 |
vla-get-blocks 과 그 내용 (0) | 2015.09.09 |