quad/.claude/session/2026-08-12-19-operator-sugar-external-research.md
qwreey 2688409ebd
decide(state,operator,ref): use-after-destroy/동적With 의도적 비지원 확정, Operator 카탈로그 외부 리서치 반영, State 이름 최종 확정
- use-after-destroy 검증 안전망: rbvm 영역/quad-debug 스코프 밖으로 최종
  기각, Ref 사용 관례(useRef급 스코프) 명문화
- :With 동적 의존성: State immutable 가정과 모순되어 의도적 비지원 확정
- Operator 콤비네이터 카탈로그: 서브 에이전트 외부 리서치로 포함 범위/
  네임스페이스 이름 근거 보강(Clamp/Min/Max 추가 후보, 비트/비교/Sub/Div
  드랍 후보, Debounce/Throttle 별도 질문으로 분리)
- State 용어 정리 최종 확정(현재 이름 유지), Pipe 기각 근거·Compute vs
  Computed 네이밍 근거 문서화, :With와 Tag/Modifier clone 체이닝 혼동
  방지 경고 추가

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VVG74qV2nQVykhvMRQW2UC
2026-08-12 21:14:15 +09:00

45 lines
3.2 KiB
Markdown

# 2026-08-12 열아홉 번째 세션 — `Operator` 콤비네이터 슈가 외부 리서치
**배경**: 사용자 요청으로 서브 에이전트(general-purpose, 웹 리서치 전용)를
띄워 `research/operator-sugar-plan.md`가 이미 스케치해둔 `Operator.*` 카탈로그
(Sum/Product/Not/And/Or/Xor/비트연산/비교연산/Concat/Sorted/Filtered)를
다른 언어/리액티브 라이브러리 실제 선례와 대조. 목적은 결정이 아니라
카탈로그 포함 범위와 네임스페이스 이름 논의에 근거를 보강하는 것.
## 리서치 결과 요약
- **선례 있음**: 논리(`Not`/`And`/`Or`) — VueUse `@vueuse/math`
`logicAnd`/`logicOr`/`logicNot`이 정확히 같은 모양. `Sum` — VueUse
`useSum`. `Clamp`/`Min`/`Max` — VueUse `useClamp`/`useMax`/`useMin`,
Ramda `R.clamp`(quad 카탈로그에 없던 새 후보로 추가 가치).
- **선례 없음/약함**: 비트연산·비교연산자는 어떤 리액티브 프레임워크에서도
"이름 붙은 파생값 콤비네이터"로 존재한 적이 없음(전부 인라인 연산자로만
씀) — 포함하면 업계 관행이 아니라 quad가 처음 시도하는 조합. `Sub`/`Div`도
마찬가지로 선례 전혀 없음(드랍 후보). `Xor`도 VueUse가 나머지 셋은 다
갖췄으면서 의도적으로 뺀 걸로 보여 약한 후보.
- **누락 발견**: Debounce/Throttle이 업계에서 가장 흔한 리액티브 콤비네이터
카테고리인데 quad 스케치에 없음 — 그런데 quad의 `Blocker`는 유저가 직접
여닫는 값 기반 게이트(타이머 없음)라 다른 메커니즘. 실제 시간 기반
debounce/throttle은 타이머(엔진 종속)가 필요해 `factory(self)->State<U>`
순수 함수 모양을 벗어나므로, `Operator.*`(quad-base)가 아니라
quad-roblox 쪽 별도 프리미티브(Tween과 비슷한 위치)일 가능성이 큼 —
이 문서 범위 밖 별도 질문으로 분리.
- **`Filtered` 판단 뒷받침**: ReactiveUI `IReactiveDerivedList`가 필터링을
아예 별도의 증분 갱신 전용 컬렉션 타입으로 다루는 것이 quad `Slot`
같은 결 — SolidJS `createMemo`+`filter`를 `<For>`에 먹이는 패턴이
문제없이 동작하는 건 `<For>` 자신이 keyed reconciliation을 하기
때문(memo identity 처리와 무관). "identity 보존 필요 없으면 plain
value transform, 필요하면 Slot"이라는 quad의 기존 경계가 정확했음을
확인.
- **네임스페이스 이름**: Python 표준 라이브러리 `operator` 모듈이 가장
강한 직접 선례(`operator.add`/`operator.lt` 등, quad와 동일한 동기 —
연산자를 `map`/`reduce`류에 넘길 이름 붙은 함수로 만드는 것). `Ops`
Rust `std::ops`가 근거지만 그건 연산자 오버로딩 trait 네임스페이스라
결이 다름(약한 선례). `Op`(단수)는 Slate.js `Op`/Immer patch처럼 "낱개
연산 객체" 지칭에 더 흔해 가장 약함. 최종 결정은 여전히 사용자 몫.
## 반영
`research/operator-sugar-plan.md`에 리서치 결과를 각 해당 절(네임스페이스
이름/포함 범위/`Filtered`)에 인라인으로 통합, Debounce/Throttle을 별도
열린 질문으로 신설. `.claude/question.md` 3번 절 동기화.