리스펙스는 입력 전용 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을 조기에 잡으세요.