이 페이지에서 변수나 매개변수 이름을 고르고 E110과 E120의 뜻을 확인할 수 있습니다. 정규화기가 검사하는 이름과 리더가 거부하는 표기를 나누어 설명합니다.
일반 이름 사용하기
아래 프로그램 전체를 플레이그라운드에 붙여 넣으세요.
(define else 5)
else결과
5else는 일반 이름으로 쓸 수 있습니다. 다만 cond와 case와 guard의 절 맨 앞에서는 특별한 뜻을 가집니다. 그 위치에서는 앞선 절이 모두 맞지 않을 때 실행할 절을 표시합니다.
아래 입력을 각각 따로 비교해 보세요.
| 소스 | 결과 또는 진단 코드 | 이유 |
|---|---|---|
(define if 5) | E110 | if는 예약어이므로 값을 연결할 수 없습니다 |
if | E110 | if는 프로시저 값이 아닌 형식의 이름입니다 |
(define include 1) | E120 | include는 코드에서 금지한 이름입니다 |
'include | include | 인용한 데이터에는 이 심볼을 넣을 수 있습니다 |
정규화기는 평가 전에 이 이름들을 검사합니다. 식의 구조를 검사하고 축약 문법을 핵심 형식으로 바꾸는 일도 합니다.
예약어 27개
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 |
마지막 행의 이름 네 개는 프로시저도 가리키므로 값으로 쓸 수 있습니다. 나머지 23개는 문법 형식의 이름입니다. 이 이름을 값 자리에 홀로 쓰면 E110이 납니다.
금지 형식 12개
아래 이름을 코드에서 참조하거나 바인딩하거나 호출하면 E120이 납니다. 인용한 데이터 안에서는 일반 심볼로 쓸 수 있습니다.
| 형식 | 작업을 표현하는 방법 |
|---|---|
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은 목록에 있는 금지 형식이나 리더 확장을 가리킵니다. alpha처럼 일반 이름을 정의하지 않고 평가하면 E300이 납니다.
읽기 중에 나는 표기 오류
리더는 아래 오류를 정규화 전에 알립니다. 허용 표기는 코드 읽기 규칙 참조에서 확인하세요.
| 표기 | 진단 코드 |
|---|---|
#; 식 주석 | E120 |
#lang 지시문 | E120 |
| 대괄호나 중괄호 | E100 |
#0=과 #0# 같은 데이터 라벨 | E100 |
#!로 시작하는 리더 지시문 | E100 |
기수·정확성 접두사 #x #b #o #e #i | E100 |
소스에 설명을 남길 때는 줄 주석이나 블록 주석을 쓰세요. ;!로 시작하는 줄도 일반 주석입니다.
세로줄은 이름에 쓸 수 있는 일반 문자입니다. 따라서 |a b|는 |a와 b|라는 두 이름으로 읽습니다. 공백을 포함한 심볼 하나를 인용하는 표기가 아닙니다.
형식 오류와 일반 이름 조회
정규화기는 =>가 있는 cond 화살표 절을 E130으로 거부합니다. case 절의 본문에서는 =>를 일반 이름으로 읽습니다. 해당 절을 실행할 때 이 이름이 정의되지 않았다면 E300이 납니다. =>를 정의하면 그 값을 읽지만 화살표 절의 동작이 생기지는 않습니다.
(lambda args args)처럼 매개변수를 이름 하나로 쓰면 E130이 납니다. 나머지 인자를 모으려면 점을 넣은 매개변수 목록을 쓰세요.
((lambda (x . rest) rest) 1 2 3)결과
(2 3)프로시저는 x에 1을, rest에 리스트 (2 3)을 연결합니다. 함수 정의에서는 (define (f . xs) xs)로 모든 인자를 모을 수 있습니다.