프로그램 구조

문자열과 템플릿

문자열과 태그 템플릿을 고르고, 유니코드 스칼라 수와 여러 줄 문자열의 들여쓰기를 확인합니다.

출력하거나 비교할 텍스트에는 문자열을 쓰세요. 경로·정규식·셸·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

제목에는 영문자 다섯 개, 공백, 이모지에 해당하는 유니코드 스칼라 값이 일곱 개 있습니다. 스칼라는 텍스트에 쓰는 유니코드 코드 포인트 하나입니다. scalars()는 스칼라 하나씩을 문자열로 담은 Array<string>을 반환합니다.

글자 뒤에 결합 악센트가 붙으면 여러 스칼라가 화면에서 한 글자로 보일 수 있습니다. 이렇게 보이는 한 글자 단위를 문자소 클러스터라고 합니다. scalars()로 센 수는 눈에 보이는 글자 수나 저장 바이트 수와 다를 수 있습니다.

토파즈는 스칼라 순서를 그대로 비교합니다. 모양이 같은 텍스트도 스칼라 배열이 다르면 서로 다른 문자열로 비교될 수 있습니다.

문자열과 템플릿 고르기

하려는 일형식결과
텍스트 출력·비교"Hello, {name}"표준 값 표시 규칙에 따라 값을 넣은 문자열
여러 줄 작성"""..."""아래 공백 규칙을 따르는 여러 줄 텍스트
경로 표현p"config/app.toml"플랫폼별 경로 정규화에 쓰는 템플릿
정규식 표현r"^[a-z]+$"이스케이프를 줄여 쓰는 정규식 템플릿
셸 명령 표현sh"tool {argument}"명령 텍스트와 인수를 구분해 담는 템플릿
SQL 질의 표현sql"WHERE id = {id}"삽입 값을 질의 매개변수로 구분해 담는 템플릿

예제의 질의는 SQL 텍스트와 제목 매개변수를 따로 보관합니다. 템플릿을 만드는 것만으로 질의나 셸 명령을 실행하지는 않습니다. 정규식 템플릿은 모든 플랫폼에서 동일하게 동작하는 완전한 정규식 문법을 정하지 않습니다.

네 태그 모두 내장 타입 template의 값을 만듭니다. 타입을 명시하려면 let 질의: template = sql"..."처럼 쓰세요. print에는 문자열을 전달하세요. 템플릿을 문자열에 보간하면 <sql template, 1 part(s), 0 interpolation(s)> 같은 요약문이 나옵니다. 실행할 질의문으로 변환하지는 않습니다.

템플릿의 태그와 텍스트 조각은 확인할 수 있습니다. 질의.tag는 "sql"을 반환합니다. 질의.parts는 "SELECT name FROM projects WHERE title = "와 ""를 담은 Array<string>을 반환합니다. 이 두 속성으로 삽입 값 자체를 꺼낼 수는 없습니다.

보간과 여러 줄 문자열 쓰기

문자열 안에 {expression}으로 표현식의 값을 넣는 것을 보간이라고 합니다. 일반 문자열과 여러 줄 문자열은 다음 이스케이프 표기를 함께 씁니다.

표기의미
\n, \t, \r줄바꿈, 탭, 캐리지 리턴
\\, \"역슬래시, 큰따옴표
\{, \}중괄호 문자

큰따옴표 세 개로 감싸면 줄바꿈을 넣을 수 있습니다. 닫는 따옴표가 별도 줄에 있으면, 그 앞의 공백·탭 배열이 들여쓰기 기준입니다. 빈 줄이 아닌 각 줄은 정확히 같은 배열로 시작해야 합니다. 맞지 않는 줄이 있으면 검사기가 오류를 냅니다. 탭은 문자 그대로 비교합니다.

언어 규칙은 첫 개행과 닫는 따옴표 기준의 들여쓰기를 제거하도록 정합니다. 현재 공개판 5.20.3 인터프리터는 이를 보존합니다. 이 인터프리터에서 정확한 텍스트가 필요하면 "one\ntwo\n"처럼 일반 문자열에 이스케이프를 명시하세요.

p, r, sh, sql 태그는 여러 줄 문자열에도 쓸 수 있습니다. 태그를 여는 따옴표에 붙이세요. p "file"처럼 띄어 쓰면 구문 오류가 납니다.

거부된 표기 고치기

시도한 표기대신 쓸 표기
text[0], text.length비어 있지 않은 문자열의 첫 스칼라는 text.scalars()[0], 개수는 text.scalars().length
문자열 슬라이스스칼라 단위가 목적에 맞으면 text.scalars()에 Array 연산 적용
백틱·작은따옴표·${expression}큰따옴표와 {expression}
html"...", 사용자 정의 태그일반 문자열이나 용도에 맞는 네 가지 지원 태그

문자소 클러스터 API와 문자열 직접 슬라이스 구문은 지원하지 않습니다. 내장 타입 이름 template으로 record template, enum template, newtype template을 선언해도 오류가 납니다.

줄바꿈은 어휘 구조와 레이아웃, 값 표시는 런타임 동작에서 이어서 보세요. 다른 문법의 대체 표기는 금지·유예 형식에서 찾을 수 있습니다.