rokdocs
v0.1

1.8. 문자 리터럴

문자 리터럴은 단일 코드포인트나 단일 바이트를 표현하기 위한 토큰입니다.

1.8.1. 두 종류

char_lit    ::= "'" char_item "'"
              | "c'" byte_item "'"
char_item   ::= <any unicode codepoint except "'" or "\\"> | escape_seq
byte_item   ::= <any ASCII byte except "'" or "\\"> | byte_escape
byte_escape ::= "\\x" hex_digit hex_digit | escape_seq

일반 문자: 'A'

'A'
'세'
'\n'
'\u{1F600}'

작은따옴표 (') 한 쌍 안에는 정확히 하나의 코드포인트를 두어야 합니다. 이스케이프 시퀀스는 문자열 리터럴 의 표를 그대로 따르며, \\, \', \", \n, \r, \t, \0, \x, \u{...} 등을 사용할 수 있습니다. '\x41' 처럼 1바이트 형태로 적어도 정상이고, 그 결과는 ASCII 범위 안의 코드포인트 하나가 됩니다. 반면 'AB' 처럼 두 글자 이상을 담거나 빈 '' 을 쓰면 어휘 단계에서 오류로 처리됩니다.

이 형태의 리터럴은 char (유니코드 스칼라값, 컴파일러 primitive) 입니다. 메서드는 stdlib 2.15 가 정의합니다.

C 호환 문자: c'A'

c'A'
c'\n'
c'\x7F'

c 접두와 작은따옴표 한 쌍으로 구성되며, 이스케이프 시퀀스는 문자열 리터럴 의 표를 그대로 따릅니다. 내용의 값은 반드시 U+0000-U+00FF 범위 안에 들어가야 하고, 이 범위를 넘어서면 어휘 오류로 취급됩니다. 예를 들어 c'세' 는 오류입니다. '세' 는 U+C138 이라 한 바이트에 담을 수 없기 때문입니다. 본문에 직접 표기하여 1바이트 범위를 채울 때에는 소스가 UTF-8 이므로 ASCII 글자만 가능하며, 비-ASCII 1바이트 값 (U+0080-U+00FF) 은 \xHH 또는 \u{H...} 이스케이프로 표기해야 합니다.

이 형태는 외부 함수 인터페이스 (FFI) 의 8비트 문자 형과 호환되는 라이브러리 타입으로 평가됩니다. 정확한 타입 이름은 타입 시스템 사양에서 정의합니다.

1.8.2. 두 종류를 분리한 이유

같은 토큰 형태 ('X') 에 두 가지 의미를 매기지 않고, 접두를 통해 명시적으로 분리합니다. 유니코드 의미의 문자와 C ABI 의 1바이트는 의미론이 서로 다르기 때문에, 같은 표기로 묶어 버리면 호환 함수를 호출할 때 의도를 명시할 방법이 사라집니다. 또한 c 접두 자체가 "FFI 와 닿는다" 는 신호를 시각적으로 남겨 주는 효과도 있습니다.

1.8.3. 길이 강제 검증

문자 리터럴은 정확히 하나의 코드포인트(일반) 또는 정확히 하나의 바이트(C 호환) 를 담아야 합니다. 이 길이 검증은 어휘 단계에서 수행되며, 길이가 맞지 않을 경우 즉시 오류를 발생시킵니다.

이러한 결정 덕분에 다음과 같은 모호함이 차단됩니다. 결합 문자 (e\u{0301} = é) 를 한 문자 리터럴에 담을 수 있는지 묻는다면, 코드포인트가 둘이므로 허용되지 않습니다. 이러한 글자는 문자열 리터럴에 두어야 합니다. 그래픽 클러스터 단위로 "사람 눈에 한 글자" 인 것 또한 문자 리터럴이 아니라 문자열 영역의 개념으로 다루고 있습니다.

이 단순화 덕분에 문자 = 코드포인트 한 개 라는 정의가 어휘 단계에서부터 일관되게 유지됩니다.

GitHub에서 이 페이지 고치기