R6RS Scheme: 어휘 문법과 datum 문법
R6RS Scheme: 어휘 문법과 datum 문법
Scheme 코드의 문법이 조직되는 세 수준 — 어휘 문법, datum 문법, 프로그램 문법 — 을 설명해요.
출처: 문서
본문
Scheme 코드의 문법은 세 수준으로 조직돼요:
어휘 문법(lexical syntax) — 프로그램 텍스트가 어떻게 렉셈(lexeme)들의 수열로 분할되는지 설명해요,
datum 문법(datum syntax) — 어휘 문법의 관점에서 공식화되며, 렉셈 수열을 *문법 데이터(syntactic data)*의 수열로 구조화하데, 여기서 문법 데이터는 재귀적으로 구조화된 실체예요,
프로그램 문법(program syntax) — 읽기 문법(read syntax)의 관점에서 공식화되며, 문법 데이터에 추가 구조를 부과하고 의미를 부여해요.
문법 데이터(*외부 표현(external representations)*이라고도 함)는 객체에 대한 표기법으로도 쓰이고, Scheme의 (rnrs io ports (6)) 라이브러리("Port I/O" 라이브러리 절)는 문법 데이터를 읽고 쓰기 위한 get-datum과 put-datum 프로시저를 제공하여, 그 텍스트 표현과 대응하는 객체 사이를 변환해요. 각 문법 데이터는 대응하는 datum 값을 나타내요. 문법 데이터는 프로그램에서 quote(11.4.1절 참조)를 사용해 대응하는 datum 값을 얻는 데 사용될 수 있어요.
Scheme 소스 코드는 문법 데이터와 (중요하지 않은) 주석으로 구성돼요. Scheme 소스 코드의 문법 데이터는 *형(form)*이라고 불려요. (다른 형 안에 중첩된 형은 하위형(subform)이라고 불려요.) 따라서 Scheme의 문법은 어떤 형인 문자 수열이라도 어떤 객체를 나타내는 문법 데이터라는 성질을 가져요. 주어진 문자 수열이 객체의 표현으로 의도되었는지 프로그램의 텍스트로 의도되었는지가 맥락 없이는 명확하지 않을 수 있으므로, 이것은 혼란을 일으킬 수 있어요. 또한 프로그램을 객체로 다루는(또는 그 반대) 인터프리터나 컴파일러 같은 프로그램을 작성하는 것을 용이하게 하므로 힘의 원천이기도 해요.
datum 값은 여러 다른 외부 표현을 가질 수 있어요. 예를 들어 "#e28.000"과 "#x1c"는 모두 정확한 정수 객체 28을 나타내는 문법 데이터이고, 문법 데이터 "(8 13)", "( 08 13 )", "
(8 .
(13 . ()))
"은 모두 정확한 정수 객체 8과 13을 담고 있는 리스트를 나타내요. 같은 객체(equal?의 의미에서; 11.5절 참조)를 나타내는 문법 데이터는 프로그램의 형으로서 항상 동등해요.
문법 데이터와 datum 값 사이의 밀접한 대응 때문에, 이 리포트는 정확한 의미가 맥락에서 분명할 때 문법 데이터나 datum 값 어느 쪽을 가리키든 때때로 datum이라는 용어를 사용해요.
구현은 어휘 문법이나 datum 문법을 어떤 식으로든 확장해서는 안 되는데, 한 가지 예외가 있어요: r6rs가 아닌 어떤 <identifier>(4.2.4절 참조)에 대해 문법 #`!<identifier>`을 문법 위반으로 취급할 필요는 없고, 표준 어휘 문법이나 datum 문법에 대한 확장을 다음 입력에 담고 있음을 나타내는 플래그로 특정 #!-접두사 식별자를 사용할 수 있어요. 이후의 입력이 이 리포트가 설명하는 어휘 문법과 datum 문법으로 쓰였다는 것을 나타내기 위해 #`!r6rs` 문법이 사용될 수 있어요. #!r6rs는 그 밖에는 주석으로 취급돼요; 4.2.3절을 보세요.