프로그램 구조

문자열과 템플릿

유니코드 텍스트를 스칼라 단위로 취급하며 일반·여러 줄·경로·정규식·셸·SQL 형식을 선택합니다.

표시하거나 비교할 텍스트에는 일반 문자열을 사용합니다. 경로, 정규식, 셸, SQL에 대한 의도를 값 내부의 구조로 유지해야 한다면 등록된 태그 템플릿을 사용합니다. 템플릿은 문자열에 장식만 덧붙인 표기가 아닙니다. 경계 자체가 구별되는 값입니다.

관찰할 수 있는 유니코드 문자열

다음 코드를 strings-templates.tpz로 저장하세요.

TOPAZ
let 제목 = "Topaz 💎"
let 스칼라수 = 제목.scalars().length
let 설정경로 = p"config/topaz.toml"
let 질의 = sql"SELECT name FROM projects WHERE title = {제목}"

print("{제목}: {스칼라수}")

검사 후 실행합니다.

BASH
topaz check strings-templates.tpz
topaz run strings-templates.tpz

출력 결과는 다음과 같습니다.

출력
Topaz 💎: 7

제목에는 유니코드 스칼라가 7개 포함됩니다. 영문자 5개, 공백 1개, 이모지 1개로 구성됩니다. scalars()Array<string>을 반환하며, 각 원소는 단일 스칼라 문자열입니다. 이는 텍스트 위치를 탐색하는 지원 방식입니다. 텍스트 위치는 저장 바이트 위치와 일치하지 않습니다. 토파즈는 유니코드를 자동으로 정규화하지 않습니다.

설정경로p 템플릿으로, 경로 정규화 의도를 담고 있습니다. 질의sql 템플릿이며, 여기서 {제목}은 SQL 원문에 그대로 연결되지 않고 매개변수 경계 역할을 합니다. 템플릿 값은 단순히 표시되는 문자열이 아닌 구조화된 값입니다. 따라서 이 프로그램은 두 템플릿을 출력하지 않습니다.

필요한 값에 맞는 형식 고르기

필요한 값형식경계
표시하거나 비교할 텍스트"Hello, {name}"보간 시 표준 값 표시 규칙을 사용
여러 줄 텍스트"""..."""닫는 구분자의 들여쓰기로 제거 범위를 결정
경로 템플릿p"config/app.toml"플랫폼 경로 정규화 의도를 보존
정규식 템플릿r"^[a-z]+$"명세에 정의된 축소 이스케이프 범위만 이식 가능
셸 명령 데이터sh"tool {argument}"값 생성만으로 프로세스를 실행하지 않음
매개변수화된 SQL 데이터sql"WHERE id = {id}"보간 요소가 매개변수 메타데이터가 됨

p, r, sh, sql 네 가지 태그는 일반 문자열은 물론 큰따옴표 3개를 사용한 문자열에도 적용할 수 있습니다. 태그와 여는 따옴표 사이에는 공백이 없어야 합니다. p "file"과 같이 띄어 쓰면 템플릿 호출로 인식되지 않습니다. 식별자와 문자열이라는 두 개 토큰으로 해석되어 구문 오류가 발생합니다.

일반 문자열과 여러 줄 문자열은 {expression} 보간과 지정된 이스케이프 집합을 함께 사용합니다. 여러 줄 문자열의 경우 여는 구분자 직후의 첫 줄바꿈은 문자열 내용에 포함되지 않습니다. 닫는 구분자 앞에 위치한 공백과 탭 접두사는 빈 줄이 아닌 모든 줄에 동일하게 포함되어 있어야 합니다. 검사를 마치면 해당 접두사는 각 줄에서 제거됩니다.

흔한 실수 고치기

문자열 내부 요소를 탐색할 때 text[0]이나 text.length, 슬라이스를 사용하지 마세요. text.scalars()로 전환한 뒤 일반 Array 연산을 사용합니다. 이 방식을 통해 스칼라 단위로 접근할 수 있으며, 이는 문자소 클러스터 단위로 분할한다는 의미는 아닙니다.

백틱, ${expression}, 작은따옴표 문자열, html"...", 등록되지 않은 인접 태그, 사용자 정의 태그는 정본 표기법이 아닙니다. sh 템플릿은 명령을 실행하지 않습니다. SQL 보간 또한 원문을 그대로 삽입하지 못합니다. HTML 템플릿, 사용자 태그 등록, 문자소 클러스터 API, 문자열 직접 슬라이스, 모든 플랫폼에서 동일한 정본식 방언, 셸 실행 시맨틱은 이 언어의 명세 범위 밖입니다.

따옴표와 줄바꿈에 관한 내용은 어휘 구조와 레이아웃에서 확인하세요. 값을 표시하는 방식은 런타임 동작에서 다룹니다. 익숙하지만 여기서는 사용할 수 없는 표기법은 금지·유예 형식에 정리해 두었습니다.