예약어와 금지 형식

이름 스물일곱은 묶을 수 없고 형식 열둘은 쓸 수 없습니다. 그리고 다른 리스프에 있지만 여기에는 없는 표기가 있습니다.

실행으로 확인하기

LISPEX
(define else 5)

else

관측 결과

OUTPUT
5

else는 예약어가 아닙니다. condcase, 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*-valuescall-with-values
define-library include include-ci include-library-declarationsmodule, 그리고 파일을 합쳐 두기

코드 자리에 나타나면 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|는 없습니다. |는 평범한 글자라 |ab| 두 이름으로 읽힙니다.

흔한 오해

E110과 E120은 둘 다 이름 때문에 나지만 뜻이 다릅니다. E110은 있는 것을 덮으려 해서, E120은 없는 것을 부르려 해서 납니다.

다음으로

형식의 정확한 모양은 핵심 형식과 파생 형식에 있고, 코드별 뜻은 오류와 경고 목록에 있습니다.

핵심 형식 · 오류와 경고 목록