실행으로 확인하기
LISPEX
(define else 5)
else관측 결과
OUTPUT
5else는 예약어가 아닙니다. cond와 case, guard의 절 머리에 있을 때만 뜻을 가지므로 이름으로 써도 그냥 통과합니다. 반대로 (define include 1)은 E120으로 거부됩니다. include가 평범한 영어 낱말이라 변수 이름으로 손이 가는데, 금지 형식 목록에 들어 있기 때문입니다.
이 순서로 생각하세요
- 예약어를 묶으려 하면 E110입니다. 이름을 바꾸세요.
- 금지 형식은 코드 자리에 나타나면 E120입니다. 묶든 부르든 상관없습니다. 다만 인용한 데이터 안은 코드가 아니므로
'include처럼 쓰면 그냥 심볼입니다. - 리더가 직접 거부하는 표기는 정규화까지 가지도 않습니다.
- 다른 리스프에서 익힌 표기 가운데 여기에 아예 없는 것들이 있습니다. 진단이 없는 것도 있으니 아래 목록을 보세요.
묶을 수 없는 이름 스물일곱
아래 이름을 define이나 let, 매개변수 자리에 두면 E110입니다.
| 갈래 | 이름 |
|---|---|
| 인용 | quote quasiquote unquote unquote-splicing |
| 코어 | lambda if begin set! define |
| 바인딩 | let let* letrec |
| 분기 | cond case guard and or when unless do |
| 모듈 | module export import |
| 값과 제어 | values call-with-values call/cc dynamic-wind |
마지막 줄 넷은 예약어이면서 프로시저이기도 합니다. 그래서 값으로 참조할 수 있습니다. 나머지 스물셋은 형식의 이름일 뿐이라 값 자리에 홀로 두면 오류입니다.
쓸 수 없는 형식 열둘
| 형식 | 대신 쓸 것 |
|---|---|
| define-syntax syntax-rules syntax-case let-syntax letrec-syntax | 사용자 매크로가 없습니다. 프로시저로 푸세요 |
| define-values let-values let*-values | call-with-values |
| define-library include include-ci include-library-declarations | module, 그리고 파일을 합쳐 두기 |
코드 자리에 나타나면 E120입니다. 인용해서 데이터로 둔 것은 해당하지 않습니다.
리더가 바로 거부하는 표기
| 표기 | 결과 |
|---|---|
#; 식 주석 | E120 |
#lang 지시문 | E120 |
[ ] { } | E100. 전용 메시지가 붙습니다 |
아예 없는 표기
cond의 화살표 절=>는 지원하지 않아 E130입니다.case의 화살표 절은 진단조차 없어서=>가 이름으로 읽히고 E300이 납니다.(lambda args ...)처럼 괄호 없이 이름 하나만 적는 매개변수 자리는 E130입니다. 인자를 모아 받으려면(lambda (x . rest) ...)나(define (f . xs) ...)를 쓰세요.- 데이텀 라벨
#0=과#0#은 없습니다. E100입니다. #!로 시작하는 리더 지시자는 없습니다. E100입니다. 파일 맨 앞에 무엇을 선언하는 표기 자체가 없습니다.- 기수와 정확성 접두사
#x#b#o#e#i는 없습니다. E100입니다. - 파이프로 감싼 심볼
|a b|는 없습니다.|는 평범한 글자라|a와b|두 이름으로 읽힙니다.
흔한 오해
E110과 E120은 둘 다 이름 때문에 나지만 뜻이 다릅니다. E110은 있는 것을 덮으려 해서, E120은 없는 것을 부르려 해서 납니다.
다음으로
형식의 정확한 모양은 핵심 형식과 파생 형식에 있고, 코드별 뜻은 오류와 경고 목록에 있습니다.