diff options
| author | eunhhu <[email protected]> | 2026-09-25 15:08:34 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-25 15:08:34 +0100 |
| commit | 2ae802cfaa3dae01627d4c80e2655fb5e69f4e1e (patch) | |
| tree | d78772098f1f22f08c4c413dc92a244939677184 /docs/design | |
| parent | 82f685e5583d3edc4e5d9d327e9925705ce51b1d (diff) | |
| download | pure-2ae802cfaa3dae01627d4c80e2655fb5e69f4e1e.tar.gz pure-2ae802cfaa3dae01627d4c80e2655fb5e69f4e1e.zip | |
Add stack copies to Pure modules
PICK copies the value n below the top, with its type and owner; SLIDE
drops n values under the top. A toolchain can compute a function's
arguments once and read each as often as the inlined body needs, instead
of repeating the argument's code. The format stays v5: no producer has
shipped modules without them.
Diffstat (limited to 'docs/design')
| -rw-r--r-- | docs/design/008-module-format.md | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/docs/design/008-module-format.md b/docs/design/008-module-format.md index a78c5f2..cc1a1a1 100644 --- a/docs/design/008-module-format.md +++ b/docs/design/008-module-format.md @@ -10,7 +10,8 @@ v1(스칼라)은 워크벤치 앱과 같은 의미였다: f64 상태, 키 입력 v2는 타입 있는 바이트 값, 필드가 있는 **메시지 입력**, 키별 **영속 컬렉션**, 응답을 더했다. v3은 **text 상태와 커서**, text 상수, text 입력, text 보기를 더했다. v4는 **레코드**, 레코드의 **리스트** 상태, 리스트의 **인덱스** 상태를 더했다. -v5는 값을 가진 채 합류하는 분기(조건식)와, 리스트 항목마다 행을 내는 **표 보기**를 더한다. 이전 판은 받지 않는다(생산자는 aup 하나다). +v5는 값을 가진 채 합류하는 분기(조건식)와, 리스트 항목마다 행을 내는 **표 보기**, 한 번 계산한 값을 여러 번 +쓰게 하는 스택 복사(PICK·SLIDE, 툴체인의 함수 인라인용)를 더한다. 이전 판은 받지 않는다(생산자는 aup 하나다). ## 바이트 배치 @@ -92,6 +93,8 @@ v5는 값을 가진 채 합류하는 분기(조건식)와, 리스트 항목마� | 59–60 | INDEX_FIRST INDEX_LAST | → i | 리스트 상태 `인자`의 첫·마지막 항목(빈 리스트면 0) | | 61 | INDEX_NUM | i → n | 0부터 센 위치 | | 62 | ROW | → i | 열이 계산하는 행. `인자`는 그 표의 리스트 상태. 열 전용 | +| 63 | PICK | … → … v | `인자`개 아래의 값을 복사해 올린다(0이면 맨 위). 타입과 대상도 그대로 | +| 64 | SLIDE | … v → v | 맨 위 값 아래의 `인자`개(1 이상)를 버린다 | `f`는 레코드 필드의 타입(수 또는 text)이다. 수 연산 결과가 유한하지 않으면 실패한다. 실패하면 그 이벤트의 모든 핸들러가 한 일이 취소된다. |
