From d0d94a05f624dd029e80883354b36f9eed52487d Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Thu, 17 Sep 2026 19:44:00 +0700 Subject: [PATCH] The refusal was about teardown, and an arena has none --- FIX.org | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/FIX.org b/FIX.org index f0e0401..e402946 100644 --- a/FIX.org +++ b/FIX.org @@ -54,15 +54,38 @@ whatever locals already do; no new borrow regime for globals that locals lack. [embed] (lib/check.ml:4265) still covers build-time data and is untouched. -** 4. edn both typed and dynamic — QUEUED behind 3 +** 4. edn both typed and dynamic — REDIRECTED to arenas, drop parked Two projects, not one. (read-edn T bytes) does not exist — vendor/edn/edn.flan is only a tokenizer, and the compile-time struct walk is NEXT.md item 9. -The dynamic half is blocked: a dynamic EDN value is recursive, so it is a Vec -whose element is move-only, which lib/check.ml:599 refuses and whose refusal -names [drop] as the fix. So [drop] gets unstashed — it now has the customer -NEXT.md:225 said it lacked. Full spec-memory.md:338 scope: recursive teardown -AND the hook. Queued behind 3 because both land in check.ml. +[drop] was dispatched to unblock the dynamic half and is being PARKED unmerged +on its branch, not reverted, because the premise was wrong. The refusal at +check.ml:599 is about *teardown*, not ownership: the type-erased runtime +releases slots bytewise and cannot walk a move-only element. An arena never +releases a slot — [free-all] takes the whole region — so the premise does not +hold there. + +That is also what Odin does, which NEXT.md:1620 already recorded: no +destructors, no drop, no finalizers; [delete] frees container memory and +nothing else. core:encoding/json ships a hand-written recursive +[destroy_value] in the *library*, and the idiomatic alternative is to parse +against temp_allocator and [free_all]. Neither is a language feature. Building +[drop] was a departure from NEXT.md:1589's settled "defer stays the answer", +taken on the assistant's prompting and withdrawn. + +So: lift check.ml:599 for arena-allocated containers, and let read-edn take an +allocator — which is already the idiom, since spec-memory.md:283 makes the +allocator part of the calling convention with an explicit override. + +The real cost, stated because it is not free: [can-free] is a RUNTIME +capability on the allocator value while check.ml:599 is a COMPILE-TIME refusal, +and the compiler cannot generally know statically that a construction site's +allocator is an arena. The spec's answer for the analogous drop case is a check +at the point of construction, one branch per container — a runtime branch. This +likely becomes a runtime trap rather than a static guarantee. + +Ownership tracking itself is untouched. Moves are still tracked; what is given +up is freeing one element individually, which is the point of an arena. ** 5. defenum autoincrement — DISPATCHED C's rule: no value means previous+1, the first is 0, explicit and implicit mix.