프로그램이 유용하려면 코드와 데이터를 구분하고 결과 하나를 골라야 합니다. 리스펙스는 두 동작을 겉으로 드러냅니다. 인용은 데이터를 보존하고, 조건식은 어느 식을 평가할지 고릅니다.
인용은 폼을 데이터로 둡니다
인용이 없으면 비어 있지 않은 리스트는 평가 대상입니다.
(+ 1 2)인용하면 같은 모양이 데이터로 반환됩니다.
'(+ 1 2)결과
(+ 1 2)평가한 값으로 새 리스트를 만들 수도 있습니다.
(list 'decision 'allow)결과
(decision allow)고정된 리터럴 데이터에는 인용을, 일부 원소를 계산해야 할 때는 list를 쓰세요.
if는 둘 중 하나를 고릅니다
if에는 검사, 참일 때의 결과, 거짓일 때의 결과가 있습니다.
(if (>= 62 50)
'(decision free-shipping)
'(decision standard-shipping))선택된 가지 하나만 실행됩니다. 오직 #f만 거짓이고, 0, "", ()는 모두
참입니다. 비어 있지 않음이나 양수를 뜻하고 싶다면 그 의미에 맞는 술어를
명시하세요.
and와 or는 일찍 멈춥니다
and는 왼쪽부터 평가하다 #f에서 멈춥니다. or는 첫 참 값에서 멈춥니다.
(and (<= 9 14)
(not #f))결과
#t답을 이미 알면 오른쪽 식은 평가하지 않습니다. 이 단락 동작도 평가 규칙의 일부입니다.
cond는 여러 경우에 이름을 붙입니다
(define (shipping-decision total member?)
(cond
((>= total 50) '(decision free-shipping))
(member? '(decision discounted-shipping))
(else '(decision standard-shipping))))
(shipping-decision 42 #t)결과
(decision discounted-shipping)절은 위에서 아래로 검사합니다. 총액이 충분하면 회원 여부보다 먼저 무료 배송을
고릅니다. else는 마지막 기본값입니다. 이름 붙은 리스트는 이 프로시저를 모르는
사람에게도 답의 뜻을 보여 줍니다.
필요할 때 리스트 살펴보기
올바른 리스트에서 car는 첫 값, cdr은 나머지 리스트를 반환합니다.
(define answer '(decision allow))
(list (car answer) (car (cdr answer)))결과
(decision allow)보통 규칙에서는 직접 만들기와 이름 붙인 도우미가 의도를 더 잘 보여 줍니다.
car와 cdr 연결은 학습과 낮은 수준 접근에 유용합니다.
연습
18세 이상이면 (decision allow), 그보다 어리면
(decision deny under-age)를 반환하는 age-decision을 작성하세요.
답 하나 보기
(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이
거짓이 아닌 이유를 설명할 수 있으면 됩니다. 다음은
첫 결정 규칙입니다.