modules: 모듈 경계, interface hash, 그리고 고정점 invalidation
되돌리기 비싼 결정 중 마지막 하나 — incremental 아키텍처 — 를 코드와
테스트로 닫는다.
- iface.ml: exported surface 추출과 해시. 별칭 한정(qualify)은 소비 시점에만
일어나므로 가져오는 쪽의 별칭이 정의 모듈의 hash에 새지 않는다.
- session.ml: 모듈 로딩과 고정점 전파. hash 비교가 dependents 재검사보다
앞선다 — 이 순서가 "본문만 수정 시 downstream 0건"의 전부다.
- 한정 이름(Alias.Type, Alias.Ctor, Alias.fn)을 타입 검사, 패턴, 소진성,
move 검사가 모두 하나의 키("Alias.name")로 본다.
- 패키지 경로(cool.dev/std/list)는 v0에서 해소하지 않고 불투명하게 둔다.
없다고 말하지 않는다.
- 회귀 테스트: 본문만 고치면 자기 자신만 재검사(1건), variant를 추가하면
downstream까지 전파되고 실제로 소진성이 깨진다(2건).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019ZVDeU6KLuUVL3gs18Hm3E
This commit is contained in:
+11
-3
@@ -77,7 +77,12 @@ let resolve_eff_atom st = function
|
||||
names
|
||||
|
||||
let rec resolve_ty st = function
|
||||
| T_named { name; args; pos } ->
|
||||
(* 한정된 이름은 별칭이 이 모듈에 있는지만 본다. 그 모듈 안에 그 타입이
|
||||
있는지는 모듈 하나만 보고 결정할 수 없다 — 외부 참조로 기록한다. *)
|
||||
| T_named { modl = Some a; args; pos; _ } ->
|
||||
if Hashtbl.find_opt st.items a <> Some K_import then external_ref st a pos;
|
||||
List.iter (resolve_targ st pos) args
|
||||
| T_named { modl = None; name; args; pos } ->
|
||||
if
|
||||
(not (List.mem name st.ty_params))
|
||||
&& (not (List.mem name builtin_types))
|
||||
@@ -118,7 +123,10 @@ let rec resolve_pattern st seen = function
|
||||
else (
|
||||
seen := n :: !seen;
|
||||
bind st pos n false))
|
||||
| P_ctor { name; args; pos } ->
|
||||
| P_ctor { modl = Some a; args; pos; _ } ->
|
||||
if Hashtbl.find_opt st.items a <> Some K_import then external_ref st a pos;
|
||||
List.iter (resolve_pattern st seen) args
|
||||
| P_ctor { modl = None; name; args; pos } ->
|
||||
(match Hashtbl.find_opt st.ctors name with
|
||||
| Some (enum, arity) when arity <> List.length args ->
|
||||
error st pos
|
||||
@@ -144,7 +152,7 @@ let rec resolve_expr st = function
|
||||
else external_ref st n pos
|
||||
| E_list (xs, _) -> List.iter (resolve_expr st) xs
|
||||
| E_struct { name; fields; pos } ->
|
||||
resolve_ty st (T_named { name; args = []; pos });
|
||||
resolve_ty st (T_named { modl = None; name; args = []; pos });
|
||||
List.iter (fun (_, e) -> resolve_expr st e) fields
|
||||
| E_closure c ->
|
||||
push st;
|
||||
|
||||
Reference in New Issue
Block a user