From 2dcdebdee11d5462547f2221750f16dd3d116651 Mon Sep 17 00:00:00 2001 From: qwreey Date: Thu, 6 Aug 2026 18:08:46 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8F=85=EB=A6=BD=20=ED=94=84=EB=A6=AC?= =?UTF-8?q?=EB=AF=B8=ED=8B=B0=EB=B8=8C=20vs=20=EC=9B=90=EC=B2=9C=20?= =?UTF-8?q?=EC=A2=85=EC=86=8D=20=ED=8C=8C=EC=83=9D=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=9B=90=EC=B9=99=20=EC=8B=A0=EC=84=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Observer가 State처럼 원천(Source/State) 없이는 존재할 수 없다는 사용자 관찰을 일반 원칙으로 승격 — Source/Ref/Store/Modifier(독립 프리미티브, Type(args) 자유 함수 생성자) vs State/Observer(파생 데이터, 원천에 대한 메소드로만 얻어짐)로 분류. state:Observer(fn)가 메소드고 자유 함수 Observer(state, fn)가 없는 더 근본적인 이유로 연결. Co-Authored-By: Claude Sonnet 5 --- .claude/base/bind-system-plan.md | 6 +++++- .claude/base/store-semantics.md | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/.claude/base/bind-system-plan.md b/.claude/base/bind-system-plan.md index 6b180ba..64f649f 100644 --- a/.claude/base/bind-system-plan.md +++ b/.claude/base/bind-system-plan.md @@ -344,7 +344,11 @@ stale하다" 수준이 아니라 **영영 갱신이 안 일어날 수 있음**. 두 개짜리 자유 함수가 되어 읽는 순서가 어색해짐), `architecture.md`의 "함수지향 디폴트, `:` 체이닝은 예외적으로만(체이닝이 정말 편한 경우만)" 원칙이 정확히 이 경우를 가리킴 — Store 값 변경 체이닝과 같은 예외 -카테고리. +카테고리. **더 근본적인 이유**: `base/store-semantics.md`의 "독립 존재 +가능한 프리미티브 vs 원천에 종속된 파생 데이터" 원칙 참고 — Observer는 +State처럼 원천 없이는 존재할 수 없는 파생 데이터라, 애초에 "타입 +이름을 부르는 자유 함수 생성자" 카테고리에 안 속함(Source/Ref/Store/ +Modifier와는 다른 부류). ```lua local observer = state:Observer(function() diff --git a/.claude/base/store-semantics.md b/.claude/base/store-semantics.md index cd1a2f8..f76f7b5 100644 --- a/.claude/base/store-semantics.md +++ b/.claude/base/store-semantics.md @@ -64,6 +64,29 @@ pull-recompute)·`:Compute` 인자 규칙·State 쓰기 금지·`Source` 독립 "Store/State/Source 온톨로지" 절 참고 — **이 절 이후 2~4차 라운드에 걸쳐 전부 확정됨, 더 이상 진행 중인 스레드 아님.** +## 일반 원칙 — 독립 존재 가능한 프리미티브 vs 원천에 종속된 파생 데이터 (2026-08-06 후속 세션) + +위 "State는 자기 고유의 독립적 value 개념이 없다"는 관찰을 일반 원칙으로 +확장(사용자 관찰): quad의 개념들은 두 부류로 갈린다. + +- **독립 존재 가능한 프리미티브** — Source, Ref, Store, Modifier. 다른 + 무언가 없이 그 자체로 `Type(args)` 팩토리 함수로 만들어짐(`Source(default)`/ + `Ref(default)`/`Store({defaults})`/`Modifier.Rounded(8)`, 위 "생성자 + 스타일 확정" 참고). +- **원천에 종속된 파생 데이터** — State, Observer. 자기 혼자 존재할 수 + 없고 항상 특정 원천(Source/다른 State)에 의존 — 그래서 이 둘은 자유 + 함수 생성자가 없고, 항상 원천에 대한 메소드 호출로만 얻어진다 + (`store.key`/`state:Compute(fn)`/`state:With(...)` → State, + `state:Observer(fn)` → Observer). "클래스 같은 독립 타입"이라기보다 + "State를 관측·핸들링하는 데이터"에 가까움. + +이게 `base/bind-system-plan.md`의 `state:Observer(fn)`가 메소드고 +`Observer(state, fn)`라는 자유 함수가 없는 더 근본적인 이유 — 단순히 +"읽기 편해서"가 아니라 Observer 자체가 State처럼 원천 없인 존재할 수 +없는 카테고리라서. 앞으로 새 개념을 추가할 때도 이 두 부류 중 어디에 +속하는지가 생성자 모양(자유 함수 팩토리 vs 원천에 대한 메소드)을 +결정하는 기준으로 쓸 수 있음. + 과거 "미해결로 남은 것"으로 적었던 두 항목도 모두 해소됨: `:Compute`의 캐싱/무효화 전략은 push-invalidate(신호만)/pull-recompute(`Get()` 시점)로 확정(`base/bind-system-plan.md` "전파 모델" 절), `store "key"` 커링의 타입