에러 핸들링: 예상치 못한 상황에 대비하기

모든 생각이 언제나 올바른 경로로 흐르는 것은 아닙니다. 리스펙스에서 오류는 실패가 아닌 또 다른 데이터입니다. 예상치 못한 상황을 우아하게 다루고, 프로그램의 안정성을 확보하는 방법을 배워보세요.

리스펙스는 입력 전용 S‑표현식 표면과 결정적 정규화를 정의합니다. 이 문서는 파싱/정규화 단계에서 발생하는 진단을 다룹니다. 런타임 동작과 예외는 타깃/호스트 실행 환경의 관할입니다.

진단 코드

권장되는 코드 체계:

  • E100 — 구문: 불법 토큰, 괄호/점리스트 오류
  • E110 — 예약: 예약어 바인딩 시도
  • E120 — 매크로: 사용자 매크로/리더 확장 금지 위반
  • E130 — 파생: 잘못된 파생 폼(예: 빈 cond)
  • E140 — 구문: 잘못된 점리스트 형태(예: 점 뒤 추가 항목)
  • E150 — 문자열: 잘못된/범위 초과 이스케이프(예: 잘못된 \x..;)
  • W200 — 정적: 사용되지 않는 바인딩
  • W210 — 정적: letrec 즉시자기참조 가능성
  • W310 — compat: R5RS‑compat에서 #u8 대체 알림
  • W320 — compat: case 비교 의미 차이 알림
  • W330 — 스타일: % 별칭 사용 감지 — modulo 권장

메시지 형식(권장): CODE file:line:col message

예시

E110: 예약어 바인딩 금지

(let ((if 1)) if)   ; E110: 예약어 바인딩 불가: if

E120: 금지된 매크로/리더 폼

(define-syntax swap ...)          ; E120: 사용자 매크로 금지
#; (reader extension example)     ; E120

E130: 잘못된 파생 폼

(cond)                            ; E130: 빈 cond

E100: 점리스트 구문 오류

(a b . c d)                       ; E100: 잘못된 점리스트

E140: 잘못된 점리스트 형태

(a .)                              ; E140: 점 뒤 꼬리 누락

W310/W320: R5RS‑compat 참고

.;! compat: r5rs 활성 시:

  • #u8(...)는 일반 벡터로 대체될 수 있으며 경고(W310)가 발생합니다.
  • 본 문서에서는 case 전개를 단순화를 위해 equal?로 서술하나, R5RS 실행기는 eqv? 비교를 사용합니다(W320).

W330: modulo 별칭 경고

% 대신 modulo 사용을 권장합니다.

(% 10 3)    ; W330: (modulo 10 3) 권장

모범 사례

  • Core + 허용된 파생 폼만 사용하고, 사용자 매크로 구성은 피하세요.
  • 순차 의존이 있으면 let*, 지역 재귀는 letrec을 사용하세요.
  • (선택) (module ...) 표면 헤더는 간단히 유지하고, R5RS‑compat에서는 평탄화됨을 염두에 두세요.
  • 정규화 스냅샷/골든 테스트로 E130을 조기에 잡으세요.