The refusal was about teardown, and an arena has none
This commit is contained in:
parent
9e80147527
commit
d0d94a05f6
35
FIX.org
35
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.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user