aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/design/008-module-format.md15
-rw-r--r--docs/design/027-computation-core.md9
2 files changed, 18 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`로 멈춘다. 조용히 버리지 않는다.
diff --git a/docs/design/027-computation-core.md b/docs/design/027-computation-core.md
index 6d24433..06e48ec 100644
--- a/docs/design/027-computation-core.md
+++ b/docs/design/027-computation-core.md
@@ -560,6 +560,15 @@
- 008: NUM_TEXT의 10진 자릿수, 메시지 행의 i64 칸(2의 보수, 리틀 엔디언 8바이트). aup의 002: `.Nd`.
- 명령 수(b45 대 b44): 실행기만의 BFS +0.09%, 나머지 ±0.001% 안이다. 은행 질의(s44와 s45를 한 번에 번갈아 여섯 번의 중앙값)는
in_credit −0.59%, per_branch −0.34%, ranks −0.20%, 나머지 ±0.01% 안이다. 일곱 질의의 답은 두 빌드에서 바이트까지 같다.
+ - **5d 만듦(2026-10-19).**
+ - Pure: 코드는 그대로다. 실행 중의 교체(`pure_app_replace`), 저장소에서의 시작(저장된 수·bool·i64 상태), 레코드가 바뀐 리스트의
+ 이전(메모리와 이미지)이 이미 한 함수 `pure_cell_as`로 옮긴다: 정수인 수(−2^63 이상 2^63 미만, −0은 0) → i64, 절댓값 2^53
+ 이하의 i64 → 수, 0·1 ↔ bool, 그 밖은 새 기본값이다.
+ - 시험: aup의 시험(`number_kinds_carried`)이 수 상태 둘(5, 2.5), i64 상태 둘(7, 2^53 + 1), 수 필드의 행 넷(3, 2.5, −0, 1e300)을
+ i64·i64·수·bool 상태와 i64 필드로 바꾼 모듈로 옮긴다: 5, 기본값 −2, 7, 기본값 false, 행 3, 9(기본값), 0, 9. 실행 중의 교체와
+ 저장소에서의 두 번의 시작(옮긴 뒤 옮긴 대로 저장된 것)이 같고, 이전 모듈로 되돌아가면 false는 i64의 0이다.
+ - 008: 교체와 시작의 규칙에 i64, `values`와 리스트 이미지의 i64 칸(2의 보수, 리틀 엔디언 8바이트).
+ - 명령 수: Pure의 코드가 그대로라 세지 않았다.
**순서의 까닭.**
- 1과 2가 묶음의 명세 대부분을 연다. 가장 값이 크다.