docs: 마무리 감사 반영 — Observer/Effect 네 진입점 의사코드 블록을 H-174 모양으로(임플 팩토리 안, module.canBound)

Co-authored-by: qwreey <me@qwreey.moe>
This commit is contained in:
qwreey-agent-selene 2026-08-29 03:24:59 +09:00
parent 67d1a41ef6
commit 28dbc818b0
No known key found for this signature in database
2 changed files with 10 additions and 4 deletions

View file

@ -617,6 +617,9 @@ quad의 반응형 그래프/cleanup 인체공학만 재사용하는 경우)로
Observer 쪽 의사코드는 가드가 첫 줄이라 이 문제가 없었다. Observer 쪽 의사코드는 가드가 첫 줄이라 이 문제가 없었다.
```lua ```lua
-- ⭐ [2026-08-29 `H-174`/`H-194`] 이 블록은 `Effect.Init(module)`이 만드는 **인스턴스별 임플 팩토리
-- 안**이다 — `Subscribed`/`WeakSubscribed`는 `Observer.implFor(module)`에서 받은 그 인스턴스의
-- 레지스트리이고, `canBound``module.canBound`(인스턴스 필드, 발화 시점에 읽음)다.
-- ⭐⭐ [2026-08-27 확정 (b), 9라운드 `H-144` 후속 — 감사 4라운드] **`EffectHandle` -- ⭐⭐ [2026-08-27 확정 (b), 9라운드 `H-144` 후속 — 감사 4라운드] **`EffectHandle`
-- 네 진입점을 자기 것으로 가진다 — Observer의 함수 본문을 배정하지 않는다.** -- 네 진입점을 자기 것으로 가진다 — Observer의 함수 본문을 배정하지 않는다.**
-- 공유하는 건 **레지스트리 두 개**(`Subscribed`/`WeakSubscribed`, 소유 모듈은 -- 공유하는 건 **레지스트리 두 개**(`Subscribed`/`WeakSubscribed`, 소유 모듈은
@ -671,7 +674,7 @@ end
-- **[2026-08-28 `H-149`]** Observer 쪽도 같은 이유로 위임을 풀고 인라인했다). -- **[2026-08-28 `H-149`]** Observer 쪽도 같은 이유로 위임을 풀고 인라인했다).
function EffectHandle:WeakSubscribe() function EffectHandle:WeakSubscribe()
if isRunning(self) then error("cannot change subscription from inside fn or cleanup", 2) end -- `H-147` if isRunning(self) then error("cannot change subscription from inside fn or cleanup", 2) end -- `H-147`
if not canBound(self) then if not module.canBound(self) then
error(if self.Subscribed then "already subscribed" else "already bound to an Instance", 2) error(if self.Subscribed then "already subscribed" else "already bound to an Instance", 2)
end end
self.Subscribed = true self.Subscribed = true
@ -682,7 +685,7 @@ end
function EffectHandle:Subscribe() function EffectHandle:Subscribe()
if isRunning(self) then error("cannot change subscription from inside fn or cleanup", 2) end -- `H-147` if isRunning(self) then error("cannot change subscription from inside fn or cleanup", 2) end -- `H-147`
if not canBound(self) then if not module.canBound(self) then
error(if self.Subscribed then "already subscribed" else "already bound to an Instance", 2) error(if self.Subscribed then "already subscribed" else "already bound to an Instance", 2)
end end
self.Subscribed = true self.Subscribed = true

View file

@ -491,12 +491,15 @@ end
`base/effect-plan.md`의 "`EffectHandle:Subscribe()`" 절이 소스: `base/effect-plan.md`의 "`EffectHandle:Subscribe()`" 절이 소스:
```lua ```lua
-- ⭐ [2026-08-29 `H-174`/`H-194`] 이 블록 전체는 `Observer.Init(module)`이 만드는 **인스턴스별 임플
-- 팩토리 안**이라고 읽을 것 — 두 레지스트리는 그 클로저 로컬(인스턴스마다 한 벌)이고,
-- `canBound`는 탑레벨 함수가 아니라 `module.canBound`(발화 시점에 읽는 인스턴스 필드)다.
local Subscribed = {} -- 강한 레지스트리(살려두는 게 목적) local Subscribed = {} -- 강한 레지스트리(살려두는 게 목적)
local WeakSubscribed = setmetatable({}, {__mode = "k"}) -- 약한 레지스트리 local WeakSubscribed = setmetatable({}, {__mode = "k"}) -- 약한 레지스트리
-- ── 프리미티브 ────────────────────────────────────────────── -- ── 프리미티브 ──────────────────────────────────────────────
function Observer:WeakSubscribe() function Observer:WeakSubscribe()
if not canBound(self) then -- bindLifetime과 정확히 같은 게이트(같은 isBoundAlive 공유) if not module.canBound(self) then -- bindLifetime과 정확히 같은 게이트(같은 isBoundAlive 공유)
error(if self.Subscribed error(if self.Subscribed
then "이미 구독된 값" -- 강/약 어느 쪽이든 이 분기 then "이미 구독된 값" -- 강/약 어느 쪽이든 이 분기
else "이미 Instance에 바인딩된 값", 2) -- [2026-08-27] `level 2` — 아래 둘과 같게 else "이미 Instance에 바인딩된 값", 2) -- [2026-08-27] `level 2` — 아래 둘과 같게
@ -534,7 +537,7 @@ function Observer:Subscribe()
-- 가리키고(`H-104` level 계약 위반), (2) 콜론 위임은 서브 테이블의 오버라이드를 -- 가리키고(`H-104` level 계약 위반), (2) 콜론 위임은 서브 테이블의 오버라이드를
-- 탄다(`H-144` (b)의 교훈). 사용자: *"weak 나 아닌거나 줄 차이가 그리 안 커서, -- 탄다(`H-144` (b)의 교훈). 사용자: *"weak 나 아닌거나 줄 차이가 그리 안 커서,
-- 분리할 큰 이유가 없음."* -- 분리할 큰 이유가 없음."*
if not canBound(self) then if not module.canBound(self) then
error(if self.Subscribed error(if self.Subscribed
then "이미 구독된 값" then "이미 구독된 값"
else "이미 Instance에 바인딩된 값", 2) else "이미 Instance에 바인딩된 값", 2)