From 8339bb48cc1176543c1abf870db5666cc97e73cd Mon Sep 17 00:00:00 2001 From: eunhhu Date: Mon, 19 Oct 2026 01:54:45 +0100 Subject: 027's 5d: a replace's rule and 008: the code was already one function (pure_cell_as) for a replace while running, the stored values at a start and a changed record's list moved (in memory and from its image): a whole number in [-2^63, 2^63) to an i64 (-0 as 0), an i64 within 2^53 to a number, 0 and 1 to and from a bool, all else the new default; aup's test number_kinds_carried runs it on states and a stored list's field, on a replace and on starts from a store; 008's replace and start say so for i64, and the values and a list image's i64 cells (two's complement, little-endian 8 bytes); no code changed, so no counts; 027 --- docs/design/008-module-format.md | 15 +++++++++------ docs/design/027-computation-core.md | 9 +++++++++ 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가 묶음의 명세 대부분을 연다. 가장 값이 크다. -- cgit v1.2.3