리더 문법

리더 문법은 공백·주석, 식별자, 불리언, 문자, 문자열, 수 토큰, 리스트, 벡터, 바이트벡터, 인용 접두사를 정의합니다.

실행으로 확인하기

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으로 거부합니다.

흔한 오해

프로필에 없는 리더 확장은 명시적으로 실패합니다.

다음으로

같은 문법을 읽어 나가는 과정으로 풀어 둔 곳은 매뉴얼이고, 거부된 토큰이 내는 코드는 목록에 있습니다.

소스 텍스트, 토큰, 리더 · 오류와 경고 목록