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)이에요.
  • resultstest-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)

없음.

더 알아보기 (Learn more)