주 시트 레이아웃 — 설계
Tabbit의 주 작성 레이아웃의 설계입니다. STRUCT DSL이 들어오면서 기존 tabbit
레이아웃(~~table:Name~~ 마커, 위치 고정 5행)으로는 임베딩 오브젝트 · 멀티 로우 ·
예약 컬럼을 표현할 자리가 없어, Luban의 시트 구조를 조사해 그 검증된 부분을 차용하고
취약한 부분을 보강한 새 레이아웃을 정의합니다.
Luban을 그대로 복제하지 않습니다. 기능 단위로 채택 · 변형 · 미채택을 판정하였고(§10),
시트 작성자가 더 직관적으로 쓸 수 있는 형태가 있으면 그쪽을 택했습니다. 조사의 근거는
Luban 레이아웃 레퍼런스(문서 · 소스 교차 검증,
커밋 8f7f4e1)와 Luban 기능 대조입니다.
행 키 레이아웃을 대체합니다. 그 설계의 분석 — 마커 열, 경계 규칙, 메모 컬럼, 수식 오류 보고의 지연, 정렬 사고 검출 — 은 이 문서가 계승하고, 표기만
:키로 다시 정의합니다. 레이아웃 id는tabbit입니다 — 기존tabbit레이아웃은 폐기가 결정되었고, 이 레이아웃이 완성되면 그 id를 승계합니다(§16의 6).
1. 목표
| 목표 | 귀결 |
|---|---|
| STRUCT DSL의 시트 결합을 온전히 표현 | (나) 타입 이름 그룹 · (다) sep 한 셀 · 멀티 로우(§6) · 예약 컬럼(§7) |
| 시트 작성자의 직관 | 특수문자 어휘 2종(§2) · 자리 하나에 뜻 하나 · 드롭다운 가능성 유지 |
| Luban에서 관찰한 취약 사례의 재발 방지 | §11의 점검표. 하나하나에 이 설계의 대응을 적었습니다 |
| 표현의 자유 | 메모 · 작업용 컬럼 · 수식을 시트 어디에나. 마커 열이 경계를 정하므로 침범 규칙이 필요 없습니다 |
| 기존 데이터 칸 규칙의 완전 계승 | 바뀌는 것은 헤더뿐입니다. 셀에 적는 값의 규칙은 전부 무변경입니다(§9) |
2. 표기 어휘 — 특수문자 2종
레이아웃이 새로 정의하는 특수문자는 :와 # 둘뿐입니다.
| 기호 | 뜻 | 나오는 자 리 |
|---|---|---|
: | 행 키와 선언 — 데이터가 아니라 구조 | 선언 :table Item(…) · 행 키 :field :type :desc :target :variant |
# | 모델에 넣지 않음 | 마커 열의 행 제외 · :field의 메모 컬럼(# 단독) · #이름@N Tombstone · 워크북 · 시트 이름의 제외(기존) |
Luban은 ## · * · ! · $ · [이름…이름] · #속성의 6가지 표기 계열을 씁니다. 이
설계는 그 전부를 위 3종과 기존 어휘로 접습니다 — $type은 자리를 옮겨 예약 컬럼으로,
*(멀티 로우)는 이름의 []로, !(빈 칸 금지)는 옵셔널의 반대인 기본값 필수 규칙으로.
기존 어휘는 그대로 계승합니다. 새로 배울 것이 아니므로 개수에 넣지 않습니다.
| 기호 | 뜻 | 근거 문서 |
|---|---|---|
? | 옵셔널. int? · int[]? · int?[] | 옵셔널 · 원소 옵셔널 |
[] (타입 칸) | 셀 안의 배열. int[] | 시트 작성 |
[n] · [] (이름) | 원소 번호 · 멀티 로우(§5 · §6) | 이 문서 |
. | 레코드 멤버 | 중첩 필드 |
@N | 와이어 태그 | 시트 작성 |
* | 보조 인덱스 | 시트 작성 |
$ | 예약 컬럼 — $type(다형 레코드의 변종) · $key · $value | 다형과 참조 배열 §5.2 |
| | 되돌렸습니다. foreign Weapon|Armour는 거부되고, 여러 테이블 중 하나여도 되는 값은 괄호 메타 refs=Weapon;Armour의 검사입니다 | 참조가 내는 이름 §6 |
- · \- | 값 없음 · 문자 - | 빈 칸과 없음 |
$를 도입합니다 — 예약 컬럼이 $type · $key · $value입니다(§7). 처음에는 이 셋을
: 접두로 받아 「:가 붙은 것은 데이터가 아니라 레이아웃의 낱말」 하나로 끝내려 했고,
2026-08-25에 되돌렸습니다.
| 되돌린 이유 |
|---|
:type이 이미 헤더 행 키입니다. 같은 낱말이 「:type 행」과 「:type 컬럼」 둘을 뜻하게 됩니다 — 역할이 아예 다른 두 자리에 한 이름입니다 |
경로 마디에서 식별자 검사가 막습니다. effect.:type은 「:Type은 유효한 식별자가 아니다」로 거부되고, 살리려면 예외가 필요합니다. 그 예외는 기호를 무엇으로 바꾸어도 똑같이 필요합니다 — 그 대가를 치를 것이면 겹치지 않는 기호를 쓰는 편이 낫습니다 |
그래서 기호는 셋입니다 — :는 행 키(:table · :field · :type · :variant),
$는 예약 컬럼($type · $key · $value), #은 제외와 주석입니다. 자리가
갈리므로 겹쳐 보이지 않습니다.
주의 —
*의 뜻이 Luban과 다릅니다. Luban의*이름은 멀티 로우이고, 이 레이아웃의*이름은 보조 인덱스(기존 tabbit 어휘)입니다. Luban에서 오는 사용자가 걸리는 지점이므로 사용자 문서에 명시하고, 멀티 로우 자리에 적힌*는[]를 안내하며 미채택합니다.
이 문서의 나머지
| 무엇 | 어디 |
|---|---|
| 3. 시트의 구조 | 선언 셀 · 마커 열 · 경계 · 헤더 행 — 레이아웃의 뼈대 |
| 헤더 행과 컬럼 경로 | :type 의 접힌 표현 · :field 의 경로 · 멀티 로우 · 예약 컬럼 |
| 엔티티별 레이아웃 | 테이블 · enum · 상수셋이 각각 어떻게 놓이는지 |
| 대조와 점검 | 다른 도구와의 대조, 취약 사례, 헷갈리는 지점, 남은 결정 |
| 구현 | 코어가 바뀌는 범위 · 게이트 · 단계별 구현 순서 |