독립 프리미티브 vs 원천 종속 파생 데이터 원칙 신설

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 <noreply@anthropic.com>
This commit is contained in:
qwreey 2026-08-06 18:08:46 +09:00
parent 83cd022011
commit 2dcdebdee1
Signed by: qwreey
GPG key ID: D28DB79297A214BD
2 changed files with 28 additions and 1 deletions

View file

@ -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()

View file

@ -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"` 커링의 타입