COND 매크로
COND 매크로 (cond)
cond는 여러 조건을 순서대로 검사해 처음으로 참이 되는 clause를 실행하는 조건 매크로예요. 다른 언어의 else if 사슬에 해당하는 다중 분기를 Lisp 스타일로 표현한 것이죠. clause마다 (test-form form*) 형태를 쓰고, 조건이 참이면 그 뒤의 폼들을 실행합니다.
출처: CLHS: Macro COND
문법 (Syntax)
cond {clause}* => result*
clause::= (test-form form*)
인자와 값 (Arguments and Values)
test-form— 폼이에요.forms— 암시적 progn(implicit progn)이에요.results—test-form이 참을 만들 첫 번째 clause의forms값, 그 clause에forms가 없으면test-form의 주 값, 혹은 어떤test-form도 참을 만들지 못하면nil이에요.
설명 (Description)
cond는 폼 실행을 test-form의 결과에 의존하게 해요.
test-form들은 인자 목록에 주어진 순서대로 하나씩 평가되다가, 참으로 평가되는 test-form을 만나면 멈춰요.
그 clause에 forms가 없으면, cond 폼은 test-form의 주 값을 돌려줘요. 그렇지 않으면 이 test-form에 딸린 forms들을 왼쪽에서 오른쪽으로 암시적 progn으로 평가하고, 마지막 폼이 돌려주는 값들이 cond 폼의 값이 돼요.
하나의 test-form이 참을 만들면 그 이후의 test-form은 더 이상 평가되지 않아요. 어떤 test-form도 참을 만들지 못하면 nil이 반환돼요.
예제 (Examples)
(defun select-options ()
(cond ((= a 1) (setq a 2))
((= a 2) (setq a 3))
((and (= a 3) (floor a 2)))
(t (floor a 3)))) => SELECT-OPTIONS
(setq a 1) => 1
(select-options) => 2
a => 2
(select-options) => 3
a => 3
(select-options) => 1
(setq a 5) => 5
(select-options) => 1, 2
세 번째 clause인 ((and (= a 3) (floor a 2)))에는 forms가 없어요. 그래서 이 조건이 참이면 and의 주 값이 그대로 cond의 값이 돼요. 마지막 호출에서 a = 5일 때 t clause가 (floor a 3)을 실행해 1, 2(다중 값)를 돌려주는 것도 확인할 수 있어요.
부수 효과 (Side Effects)
없음.
영향 (Affected By)
없음.
예외 상황 (Exceptional Situations)
없음.
함께 보기 (See Also)
if,case.
참고 (Notes)
없음.