프로그램 구조

문자열과 템플릿

유니코드 텍스트를 스칼라 단위로 보고 일반·여러 줄·경로·정규식·셸·SQL 형식을 고릅니다.

표시하거나 비교할 텍스트에는 일반 문자열을 사용합니다. 값이 경로, 정규식, 셸, SQL 의도를 구조화해 보존해야 한다면 등록된 태그 템플릿을 사용합니다. 템플릿은 문자열에 장식만 붙인 표기가 아니라 다른 경계를 가진 값입니다.

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

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

TOPAZ
let title = "Topaz 💎"
let scalarCount = title.scalars().length
let configPath = p"config/topaz.toml"
let query = sql"SELECT name FROM projects WHERE title = {title}"

print("{title}: {scalarCount}")

검사하고 실행합니다.

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

출력은 다음과 같습니다.

출력
Topaz 💎: 7

title에는 영문자 다섯 개, 공백 하나, 이모지 하나로 모두 일곱 개의 유니코드 스칼라가 있습니다. scalars()는 원소가 단일 스칼라 문자열인 Array<string>을 반환합니다. 텍스트 위치는 저장 바이트 위치와 같지 않으며, 토파즈는 유니코드를 암묵적으로 정규화하지 않습니다.

configPathp 템플릿이므로 경로 정규화 의도를 가집니다. querysql 템플릿이며 {title}은 SQL 원문에 직접 이어 붙는 대신 매개변수 경계가 됩니다. 템플릿 값은 일반 표시 문자열이 아닌 구조화된 값이므로 이 프로그램은 두 템플릿을 출력하지 않습니다.

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

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

p, r, sh, sql 네 태그는 일반 문자열과 큰따옴표 세 개를 쓴 문자열에 모두 붙일 수 있습니다. 태그와 여는 따옴표 사이에는 공백이 없어야 합니다. p "file"처럼 띄우면 호출이 아니라 식별자와 문자열 두 토큰이 되어 구문 오류가 됩니다.

일반 문자열과 여러 줄 문자열은 {expression} 보간과 고정된 이스케이프 집합을 공유합니다. 여러 줄 문자열의 여는 구분자 바로 뒤에 줄바꿈이 있으면 그 첫 줄바꿈은 내용에 들어가지 않습니다. 닫는 구분자 앞의 정확한 공백·탭 접두사는 비어 있지 않은 각 줄에도 있어야 하며, 검사 뒤 그 접두사가 제거됩니다.

흔한 실수 고치기

문자열을 살펴보려고 text[0], text.length, 슬라이스를 쓰지 마세요. text.scalars()로 바꾼 뒤 일반 Array 연산을 사용합니다. 이는 스칼라 단위 접근이며 문자소 클러스터 분할을 보장한다는 뜻은 아닙니다.

백틱, ${expression}, 작은따옴표 문자열, html"...", 등록되지 않은 인접 태그, 사용자 정의 태그는 정본 표기가 아닙니다. sh 템플릿은 실행하지 않으며, SQL 보간도 원문 직접 삽입을 허용하지 않습니다. HTML 템플릿, 사용자 태그 등록, 문자소 클러스터 API, 문자열 직접 슬라이스, 모든 플랫폼에서 같은 정규식 방언, 셸 실행 의미는 이 언어 표면 밖입니다.

따옴표와 줄바꿈은 어휘 구조와 레이아웃, 값 표시 방식은 실행 환경 동작, 사용할 수 없는 익숙한 표기는 금지·유예 형식에서 확인하세요.