데이터, 조건, 결정

심볼과 리스트를 데이터로 보존하고, `if`와 `cond`로 답을 고르고, 단락 평가와 이름 붙은 결정값을 배웁니다.

프로그램이 유용하려면 코드와 데이터를 구분하고 결과 하나를 골라야 합니다. 리스펙스는 두 동작을 겉으로 드러냅니다. 인용은 데이터를 보존하고, 조건식은 어느 식을 평가할지 고릅니다.

인용은 폼을 데이터로 둡니다

인용이 없으면 비어 있지 않은 리스트는 평가 대상입니다.

LISPEX
(+ 1 2)

인용하면 같은 모양이 데이터로 반환됩니다.

LISPEX
'(+ 1 2)

결과

OUTPUT
(+ 1 2)

평가한 값으로 새 리스트를 만들 수도 있습니다.

LISPEX
(list 'decision 'allow)

결과

OUTPUT
(decision allow)

고정된 리터럴 데이터에는 인용을, 일부 원소를 계산해야 할 때는 list를 쓰세요.

if는 둘 중 하나를 고릅니다

if에는 검사, 참일 때의 결과, 거짓일 때의 결과가 있습니다.

LISPEX
(if (>= 62 50)
    '(decision free-shipping)
    '(decision standard-shipping))

선택된 가지 하나만 실행됩니다. 오직 #f만 거짓이고, 0, "", ()는 모두 참입니다. 비어 있지 않음이나 양수를 뜻하고 싶다면 그 의미에 맞는 술어를 명시하세요.

andor는 일찍 멈춥니다

and는 왼쪽부터 평가하다 #f에서 멈춥니다. or는 첫 참 값에서 멈춥니다.

LISPEX
(and (<= 9 14)
     (not #f))

결과

OUTPUT
#t

답을 이미 알면 오른쪽 식은 평가하지 않습니다. 이 단락 동작도 평가 규칙의 일부입니다.

cond는 여러 경우에 이름을 붙입니다

LISPEX
(define (shipping-decision total member?)
  (cond
    ((>= total 50) '(decision free-shipping))
    (member? '(decision discounted-shipping))
    (else '(decision standard-shipping))))

(shipping-decision 42 #t)

결과

OUTPUT
(decision discounted-shipping)

절은 위에서 아래로 검사합니다. 총액이 충분하면 회원 여부보다 먼저 무료 배송을 고릅니다. else는 마지막 기본값입니다. 이름 붙은 리스트는 이 프로시저를 모르는 사람에게도 답의 뜻을 보여 줍니다.

필요할 때 리스트 살펴보기

올바른 리스트에서 car는 첫 값, cdr은 나머지 리스트를 반환합니다.

LISPEX
(define answer '(decision allow))
(list (car answer) (car (cdr answer)))

결과

OUTPUT
(decision allow)

보통 규칙에서는 직접 만들기와 이름 붙인 도우미가 의도를 더 잘 보여 줍니다. carcdr 연결은 학습과 낮은 수준 접근에 유용합니다.

연습

18세 이상이면 (decision allow), 그보다 어리면 (decision deny under-age)를 반환하는 age-decision을 작성하세요.

답 하나 보기
LISPEX
(define (age-decision age)
  (if (>= age 18)
      '(decision allow)
      '(decision deny under-age)))

(age-decision 17)

결과는 (decision deny under-age)입니다.

4단계로 갈 준비가 됐나요?

'(decision allow)(decision allow)의 차이, if의 세 위치, 0이 거짓이 아닌 이유를 설명할 수 있으면 됩니다. 다음은 첫 결정 규칙입니다.