set과 map
STRUCT DSL의 컨테이너 타입입니다. 형식은 움직이지 않습니다 — set은 배열 컬럼 하나이고
map은 키·값 컬럼 둘입니다. 새로 드는 것은 표기와 검사, 그리고 모든 언어의 컨테이너 타입
입니다.
1. 지금까지 된 것
STRUCT DSL 설계 §4.7이 「문법과 모델까지 받고 그 뒤에서 이름과 함께 거절한다」고 정하였고, 그대로 되어 있습니다.
| 무엇 | 어디 | 상태 |
|---|---|---|
렉서의 < · > · , | SchemaLexer.cs | 받습니다 |
set<T> · map<K,V> 파싱 | SchemaParser.cs:667 | SchemaTypeForm.Container로 읽습니다 |
| 타입 표현의 재구성 | SchemaSyntax.cs:236 | ToString()이 원래 표기를 되돌립니다 |
| 거절 | SchemaDeclarations.cs:482 | schema.container-not-supported |
| 컬럼 해석 | SchemaFieldTypes.cs:112 | false를 돌려줍니다 |
그래서 이 문서가 정할 것은 문법의 나머지와 그 뒤 전부입니다.
2. 표기
2.1 타입 표현
field tags set<string>
field prices map<int,int>
field drops map<int,Reward>[]
field owners set<int>?
| 무엇 | 되는가 |
|---|---|
배열과의 조합 — set<int>[] · map<int,Reward>[] | 1차에서 거부합니다. 파일은 담을 수 있는데 셀 표기가 없습니다 — set의 배열은 컬럼 하나가 목록의 목록이 되고, map의 배열은 번호 붙은 그룹(Prices1.Key)이 되는데 그 표기가 정해져 있지 않습니다 |
값 옵셔널 — set<int>? · map<K,V>? | 됩니다. 배열의 T[]?와 같은 뜻입니다 |
원소 옵셔널 — map<K,V?> | 담지 않습니다(§10) |
중첩 컨테이너 — map<int,set<int>> | 담지 않습니다(§10) |
인자 개수가 안 맞는 것 — map<int> · set<int,int> | schema.container-arity로 거부합니다. 메시지 id는 이미 있습니다 |
꺾쇠를 고른 이유는 설계 §4.7에 있습니다 — 대괄호는 배열 표기와 구분되지 않고, 이 DSL에는
비교 연산자가 없어 < >가 비어 있습니다.