aboutsummaryrefslogtreecommitdiffstats
path: root/docs/design/008-module-format.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/design/008-module-format.md')
-rw-r--r--docs/design/008-module-format.md15
1 files changed, 9 insertions, 6 deletions
diff --git a/docs/design/008-module-format.md b/docs/design/008-module-format.md
index c817c48..4d950fd 100644
--- a/docs/design/008-module-format.md
+++ b/docs/design/008-module-format.md
@@ -354,9 +354,11 @@ frame 핸들러 없는 앱의 frame)은 보내지 않는다. 호스트는 앱을
2. 핸들러를 소스 순서대로 실행한다. 실패하면 상태를 되돌린다.
3. 저장한다(지연 저장이면 묶음의 저장에서). 저장이 실패하면 상태를 되돌린다. 결과 불명(`uncertain`)이면 그렇게 보고한다.
-모듈을 바꾸면(`pure_app_replace`) 상태는 이름과 종류가 같을 때 남는다. 수와 bool은 서로 옮긴다. 수 0(−0도)과 1은 false와
-true가 되고 다른 수는 기본값이 되며, bool은 0과 1이 된다. 레코드가 같으면 리스트를 그대로 쓰고,
-레코드가 바뀌었으면 항목마다 이름과 타입이 같은 필드(수와 bool은 위처럼)를 옮기고 새 필드는 기본값으로 채운다(키 있는 리스트는 그다음 키
+모듈을 바꾸면(`pure_app_replace`) 상태는 이름과 종류가 같을 때 남는다. 수, bool, i64는 값이 정확히 옮겨질 때만 서로
+옮긴다(`pure_cell_as`, 027의 5단계): 정수인 수는 −2^63 이상 2^63 미만이면 i64가 되고(−0은 0), i64는 절댓값이 2^53 이하면
+수가 되며, 0(−0도)과 1은 false와 true가, bool은 0과 1이 된다. 그 밖의 값(i64로 갈 2.5, 수로 갈 2^53 + 1, bool로 갈 2)은
+새 기본값이 된다. 레코드가 같으면 리스트를 그대로 쓰고,
+레코드가 바뀌었으면 항목마다 이름과 타입이 같은 필드(수·bool·i64는 위처럼)를 옮기고 새 필드는 기본값으로 채운다(키 있는 리스트는 그다음 키
순서로 놓인다). 커서와 인덱스는 대상
text·리스트가 남을 때만 위치를 유지한다.
@@ -394,12 +396,12 @@ ANCHOR_AT, ANCHOR_STORE)를 만든다. 그래서 인터페이스(Vega)는 앱 �
|---|---|
| text | `text-이름`: UTF-8 바이트 그대로. 앱의 draft가 곧 저장 문서라 입력 한 글자는 바뀐 익스텐트만 추가한다 |
| 리스트 | 이미지와 로그(아래). 트리에는 두지 않는다 |
-| 수·bool·커서·인덱스 | `values`: `PVS1`, 상태마다 종류·이름·binary64(bool은 0이나 1). 바뀐 이벤트에서만 다시 쓴다 |
+| 수·bool·i64·커서·인덱스 | `values`: `PVS1`, 상태마다 종류·이름·8바이트(수는 binary64, bool은 0이나 1의 binary64, i64는 2의 보수, 리틀 엔디언). 바뀐 이벤트에서만 다시 쓴다 |
- **리스트: 이미지와 로그.** 리스트는 저장소 디렉터리의 두 곳에 산다. **이미지** `image-이름`(파일 하나)은
`PLI1`, 레코드 필드 수, 필드마다 종류(0 수, 1 text, 2 바이트, 3 bool, 4 i64, 5 리스트)·이름(리스트는 그 뒤에 u8: 항목들의 레코드 번호), 리스트
필드가 있으면 레코드 그래프의 나머지(u8 수, 레코드마다 u8 필드 수와 필드들, 번호는 그래프에서의 자리: 0이 이 리스트의 레코드,
- 나머지는 리스트 필드가 처음 만나는 차례), 그것이 담은 저장의 번호(u64), 항목(수와 bool은 binary64, text와 리스트는 u32 길이와
+ 나머지는 리스트 필드가 처음 만나는 차례), 그것이 담은 저장의 번호(u64), 항목(수와 bool은 binary64, i64는 2의 보수, text와 리스트는 u32 길이와
바이트)이고, 통째로 옆에 써서 동기화한 뒤 이름을 바꿔 끼운다(파일 전체의 다이제스트로 잘림·손상을 거부).
**로그**(`log-0`, `log-1`, ... 구간, `core/log.h`)는 리스트를 바꾼 저장마다 항목 하나다. 항목은 저장 번호, 앞 항목의
번호와 다이제스트, 트리도 커밋했는지, 페이로드(바뀐 리스트마다 이름과 변경 기록, 모두 그 리스트 이미지의 필드로)다.
@@ -421,7 +423,8 @@ ANCHOR_AT, ANCHOR_STORE)를 만든다. 그래서 인터페이스(Vega)는 앱 �
시작할 때 읽어 이미지를 쓰고 비운다.
- **시작.** 저장된 상태를 이름과 종류로 불러온다. 리스트는 이미지를 읽고 로그에서 그 이미지가 담은 저장 뒤의 변경을
차례로 다시 한다. 없는 상태는 초기값으로 시작한다. 레코드가 달라진 리스트는
- 이름·종류가 같은 필드를 옮기고(수와 bool은 교체처럼 서로 옮긴다) 새 필드는 기본값을 쓴 뒤 다시 저장한다(교체와 같은 규칙, 마이그레이션 스크립트 없음).
+ 이름·종류가 같은 필드를 옮기고(수·bool·i64는 교체처럼 정확할 때만 서로 옮긴다) 새 필드는 기본값을 쓴 뒤 다시 저장한다(교체와 같은 규칙, 마이그레이션 스크립트 없음).
+ 저장된 수·bool·i64 상태도 같은 규칙으로 새 모듈의 타입이 된다.
리스트 필드의 항목도 그래프의 레코드를 따라 같은 규칙으로 옮겨진다(3단계).
커서가 text 범위나 글자 경계를 벗어나거나, 인덱스가 리스트 밖이면 0이 된다. 깨진 리스트·text(형식 오류, UTF-8
아님)는 시작을 `store_error`로 멈춘다. 조용히 버리지 않는다.