- 신선한 탐사자(fable) 단일 컨텍스트, 지시서 -round10-brief.md §2 레인 A·C 완료, B 부분, D ALL PASS - audit/handtrace-round10-reference-impl/: round7 참조 구현을 현재 계약으로 갱신·재실행 (부수: round7/ref9 _recompute 첫 인자 오류 발견·정정) - base/·인덱스 레이어는 미변경 — 결정은 사용자 배치 회신 뒤 -round10-followup.md로 Co-authored-by: qwreey <me@qwreey.moe> Claude-Session: https://claude.ai/code/session_01546hjsYNLSMZdHdPyTZaGb
34 lines
2.2 KiB
Text
34 lines
2.2 KiB
Text
--!nocheck
|
||
-- 레인 B: `:List` × Detach × KeyGone × 재등장(재마운트) × 파괴 — settle 분기 전부를 값으로
|
||
local q = require("./core10"); local D = require("./dispatch10")
|
||
local inst = q.newInst("inst")
|
||
local items = q.Source({ "a", "b", "c" })
|
||
local created, disposed = {}, {}
|
||
local slot = D.newSlot("L")
|
||
D.List(slot, items, function(item, physIndex, offset, prev, ud)
|
||
if item == D.KeyGone then return D.Detach end -- 사라진 키는 홀드
|
||
if prev then return prev end
|
||
local e = { name = item }; created[#created+1] = item
|
||
return e
|
||
end, function(item) return item end)
|
||
D.mountTop(inst, slot, 1)
|
||
local function names() local t = {}; for _, e in ipairs(slot._elements) do t[#t+1] = e.name end; return table.concat(t, ",") end
|
||
local function detachedKeys() local t = {}; for k in pairs(slot._detached or {}) do t[#t+1] = k end; table.sort(t); return table.concat(t, ",") end
|
||
print("population:", names(), "| created", table.concat(created, ","))
|
||
items:Set({ "a", "c" })
|
||
print("{a,c}: mounted", names(), "| detached", detachedKeys(), "| Length", slot.Length:Get(), "| 물리:", table.concat(D.native, " ", #D.native - 0))
|
||
local n0 = #D.native
|
||
items:Set({ "a", "b", "c" })
|
||
print("{a,b,c} 재등장: mounted", names(), "| detached", detachedKeys(), "| created 추가?", #created, "(기대 3 — 재사용) | 물리:", table.concat(D.native, " ", n0 + 1))
|
||
local bk = D.getBookkeeping(slot)
|
||
print(" bk.N", bk.N, "lengthList", table.concat(bk.lengthList, ",", 1, bk.N), "indexOfElement[b] =", bk.indexOfElement[slot._elements[2]])
|
||
-- KeyGone 뒤 새 값 반환은 error
|
||
local slot2 = D.newSlot("L2"); local items2 = q.Source({ "x" })
|
||
D.List(slot2, items2, function(item, _, _, prev) if item == D.KeyGone then return { name = "new" } end; return prev or { name = item } end, function(i) return i end)
|
||
local inst2 = q.newInst("inst2"); D.mountTop(inst2, slot2, 1)
|
||
print("KeyGone에 새 값:", select(2, pcall(function() items2:Set({}) end)))
|
||
-- Detach 홀드 중 Slot 파괴 → _detached도 파괴
|
||
n0 = #D.native
|
||
D.destroySlotTree(slot)
|
||
print("destroySlotTree 뒤 물리:", table.concat(D.native, " ", n0 + 1), "| _destroyed", slot._destroyed)
|
||
print("파괴된 Slot 재마운트:", select(2, pcall(function() D.mountTop(q.newInst("i3"), slot, 1) end)))
|