실행으로 확인하기
LISPEX
(list #\a #\x41 "\x41;" #true)관측 결과
OUTPUT
(a A A #t)문자는 #\ 뒤에 스칼라 하나를 적는 것이 기본형입니다. #\a처럼 씁니다. 16진으로도 적을 수 있고 그때는 세미콜론을 붙이지 않습니다. 이름이 붙은 문자는 아래 목록에 있는 열넷뿐입니다. 문자열 안에서 쓸 수 있는 이스케이프도 닫힌 집합입니다. \"와 \\, \n, \t, \r, 그리고 16진 표기 \xHEX; 여섯뿐이고 여기에는 세미콜론이 붙습니다. 다른 글자를 붙이면 E150입니다. 다른 언어에서 흔한 \a도 여기에는 없습니다.
#true와 #false는 각각 #t, #f와 같은 값입니다.
이 순서로 생각하세요
- 정수는
-?(0|[1-9][0-9]*)꼴입니다. 유리수는 정수 분자와, 허용되는 표기 하나로 적은 양의 분모로 쓰고, 실수에는 소수부나 지수가 반드시 있어야 합니다. - 점 리스트 위치, 이스케이프 표기, 바이트 범위, 구분자 닫힘은 정규화 전에 검사합니다.
- 문자열의 16진 스칼라는
\xHEX;로 쓰고, 문자는 세미콜론 없이#\xHEX로 씁니다. - 소스 범위는 리더 입력 동일성과 결정적 위치로 기록합니다.
- 부호를 앞에 붙인
+5는 수가 아니라 이름입니다. 음수만-를 허용하므로(define +5 7)은 그냥 통과합니다. - 소수부를 비운
1.은 E100입니다. 소수부나 지수 중 하나는 실제로 적어야 합니다. - 괄호는
(와)하나뿐입니다.[나{를 쓰면 전용 메시지와 함께 E100이 납니다. - 점은 뒤가 구분자일 때만 점 쌍 표시입니다. 그래서
...이나.foo는 그냥 이름입니다. 벡터 안에는 점을 쓸 수 없어#(1 . 2)는 E100입니다. - 바이트벡터 원소는 글자 그대로 적은 0부터 255까지의 정수뿐입니다. 계산하면 2가 되는
#u8(4/2)도 거부합니다.
고정 토큰 문법
| 토큰 | 허용 형태 | 거부 경계 |
|---|---|---|
| 정수 | -?(0|[1-9][0-9]*) | 선행 0, 기수·정확성 접두사 |
| 유리수 | <integer>/[1-9][0-9]*, 읽은 뒤 기약 | 0·음수 분모 표기, 선행 0 분모 |
| 실수 | 소수부 또는 지수가 있는 십진수 | 정수와 모호한 표기, 비유한 리터럴 |
| 문자열 | 고정 이스케이프를 포함한 따옴표 UTF-8. 16진은 \xHEX; | 끝나지 않은 이스케이프, 16진 세미콜론 누락 |
| 문자 | #\<scalar>, #\xHEX, 또는 고정 이름 형식 | 잘못된 스칼라, 16진 문자 뒤의 세미콜론 |
| 바이트벡터 | #u8(<byte> ...) | 0..255 밖 요소 |
이름 있는 문자는 정확히 space, newline, linefeed, tab,
return, null, nul, delete, rubout, escape, esc, backspace,
alarm, page입니다. 줄 주석은 ;로 시작하고 블록 주석은 중첩 가능한
#| ... |#를 씁니다. #; datum 주석과 #lang 지시문은 공백이나 주석처럼
조용히 버리지 않고 E120으로 거부합니다.
흔한 오해
프로필에 없는 리더 확장은 명시적으로 실패합니다.
다음으로
같은 문법을 읽어 나가는 과정으로 풀어 둔 곳은 매뉴얼이고, 거부된 토큰이 내는 코드는 목록에 있습니다.