표시하거나 비교할 텍스트에는 일반 문자열을 씁니다. 경로, 정규식, 셸, SQL 의도를 값 안에 구조로 남겨야 한다면 등록된 태그 템플릿을 씁니다. 템플릿은 문자열에 장식만 붙인 표기가 아닙니다. 경계 자체가 다른 값입니다.
관찰할 수 있는 유니코드 문자열
다음 코드를 strings-templates.tpz로 저장하세요.
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}")검사하고 실행합니다.
topaz check strings-templates.tpz
topaz run strings-templates.tpz
출력은 다음과 같습니다.
Topaz 💎: 7title에는 유니코드 스칼라가 일곱 개 있습니다. 영문자 다섯 개, 공백
하나, 이모지 하나입니다. scalars()는 Array<string>을 반환하고, 그
원소는 스칼라 하나짜리 문자열입니다. 이것이 텍스트 위치를 살펴보는 지원
방식입니다. 텍스트 위치는 저장 바이트 위치와 다릅니다. 토파즈는 유니코드를
알아서 정규화하지 않습니다.
configPath는 p 템플릿입니다. 그래서 경로를 정규화하겠다는 의도를
담습니다. query는 sql 템플릿입니다. 여기서 {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, 문자열
직접 슬라이스, 모든 플랫폼에서 같은 정규식 방언, 셸 실행 의미는 이
언어 표면 밖입니다.
따옴표와 줄바꿈은 어휘 구조와 레이아웃에서 확인하세요. 값을 표시하는 방식은 실행 환경 동작에 있습니다. 익숙하지만 여기서는 쓸 수 없는 표기는 금지·유예 형식에 모아 두었습니다.