Topaz는 Array, Map, Set의 생성, 순회, 중복 처리, 순서, 인덱싱, 변경 규칙을 관찰 가능한 언어 동작으로 정합니다.
정책
배열은 [a, b], 맵은 {key: value}, 집합은 #{a, b}로 만듭니다. 배열과 함수 호출의 ...expr는 Array<T>만 펼칠 수 있습니다. for pattern in source { body }는 소스 순서대로 본문의 값을 모은 배열을 만듭니다. if 조건을 붙여 항목을 거를 수 있습니다.
명시된 동작
리터럴 항목과 스프레드는 왼쪽에서 오른쪽으로 평가됩니다. 맵과 집합은 삽입 순서를 유지합니다. 기존 키의 값을 바꾸면 순서가 유지되고, 삭제했다가 다시 넣으면 맨 뒤로 이동합니다. 맵의 중복 키와 집합의 중복 원소는 주어진 표현식을 모두 평가한 뒤 하나의 항목으로 정리됩니다.
제약과 명시적 거부
인덱스는 범위를 벗어나면 실행 오류가 납니다. 안전한 조회는 .get을 사용해 Option을 받습니다. 맵 키와 집합 원소는 키로 쓸 수 있는 타입이어야 합니다. 문자열은 반복 가능한 컬렉션으로 취급되지 않으므로 스칼라를 직접 얻어야 합니다.
유예 경계
사용자 정의 반복자, 지연 컴프리헨션, 병렬 컴프리헨션, 튜플과 임의 반복 가능 값의 스프레드, 순서가 없는 컬렉션 의미는 현재 범위 밖입니다.
예제
TOPAZ
let squares = [ for value in [1, 2, 3] => value * value ]
let ids = set { for value in [2, 1, 2] => value }
let labels = map { for value in [1, 2] => value: "item {value}" }
print("{squares}:{ids.toArray()}:{labels.keys}")