조건식과 파생 형식

if와 시퀀스, 바인딩, 람다, 적용, 대입, 인용으로 이루어진 작은 코어가 있습니다. 파생 형식은 사용자가 붙인 이름을 절대 붙잡지 않는 방식으로 이 코어 위에 다시 쓰입니다.

언제 필요한가요?

조건식은 질문의 모양을 보고 고르세요. 예/아니오를 한 번 묻는지, 술어가 여럿인지, 한 값을 고정 datum들과 비교하는지, 한쪽 경우에만 효과를 실행하는지에 따라 답이 갈립니다. 그리고 거짓인 값은 #f 하나뿐이라는 점을 기억하세요.

실행으로 확인하기

LISPEX
(case 2 ((1) 'one) ((2) 'two) (else 'other))

관측 결과

OUTPUT
two

예제 읽기

case2를 한 번만 평가합니다. 그런 다음 나열된 각 datum과 eqv?로 비교해 두 번째 절을 고릅니다. 결과는 인용된 심볼 two이고, else 절은 평가하지 않습니다.

when은 검사가 참일 때만 본문을 차례로 실행하고 마지막 값을 냅니다. unless는 반대로 검사가 거짓일 때 실행합니다. 그래서 (when #t 42)는 42이고 (unless #f 7)은 7입니다. 검사가 어긋난 쪽은 값을 하나도 내지 않습니다.

guard(guard (변수 절 ...) 본문 ...) 모양입니다. 본문에서 오류가 나면 그 오류 객체가 변수에 묶이고 절들이 cond처럼 차례로 검사됩니다. 절 머리에 else를 쓸 수 있습니다.

이 순서로 생각하세요

  • condcase, and, or, when, unless, let*, 이름 있는 let, do, 준인용은 고정된 평가 순서와 꼬리 위치를 보존합니다.
  • 정규화가 만들어 내는 임시 이름과 숨은 내장 연산은 사용자 이름에 붙잡히거나 가려지지 않습니다.
  • case는 datum을 eqv?로 비교합니다. whenunless의 거짓 경로는 0개 값을 냅니다.
  • if는 세 부분이 다 있어야 합니다. 거짓 가지를 빼고 (if #t 1)이라고 쓰면 E130입니다.
  • else 절이 없는 condcase가 아무 절도 맞추지 못하면 값을 하나도 내지 않습니다. 그 결과를 값 자리에 놓으면 E320이 납니다.
  • else는 예약어가 아닙니다. condcase, guard의 절 머리에서만 뜻을 가지므로 (define else 5)는 그냥 통과합니다.
  • cond의 화살표 절 =>는 지원하지 않습니다. 쓰면 E130입니다. case의 화살표 절은 진단조차 없어서 =>가 이름으로 읽히고 E300이 납니다.

빠르게 고르기

형식쓸 때결과 동작
if분기가 정확히 둘일 때선택한 분기의 값을 반환
cond여러 술어가 각 경우를 설명할 때처음 맞는 절을 반환
case한 값을 고정 datum들과 비교할 때키를 한 번만 평가
and / or검사가 단락 평가 사슬일 때불리언으로 바꾸지 않고 피연산자 값을 반환
when / unless한쪽 효과만 표현할 때거짓 경로는 0개 값

흔한 오해

define-syntax나 사용자 매크로 확장은 없습니다.

현재 경계

  • 준인용 밖에 단독으로 쓴 unquote, unquote-splicing은 정적 오류입니다.

다음으로

일상적으로 쓰는 형식은 데이터와 결정 수업에서 익히세요. 정확한 정규화 형태는 파생 형식 레퍼런스에 있습니다.

데이터와 결정 · 파생 형식