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:
+18
-4
@@ -11,7 +11,14 @@ type eff_atom = Eff_var of string | Eff_set of eff_name list
|
||||
type eff_result = eff_atom list (* 합집합. 길이 1이면 단일 *)
|
||||
|
||||
type ty =
|
||||
| T_named of { name : string; args : targ list; pos : pos }
|
||||
(* modl: 다른 모듈의 타입은 별칭으로 한정한다 (Shapes.Shape).
|
||||
한정하지 않으면 이 모듈의 이름이다 — 암묵적으로 끌어오지 않는다. *)
|
||||
| T_named of {
|
||||
modl : string option;
|
||||
name : string;
|
||||
args : targ list;
|
||||
pos : pos;
|
||||
}
|
||||
| T_fn of {
|
||||
affine : bool;
|
||||
params : ty list;
|
||||
@@ -28,7 +35,12 @@ type pattern =
|
||||
| P_wild of pos
|
||||
| P_lit of lit * pos
|
||||
| P_bind of string * pos
|
||||
| P_ctor of { name : string; args : pattern list; pos : pos }
|
||||
| P_ctor of {
|
||||
modl : string option;
|
||||
name : string;
|
||||
args : pattern list;
|
||||
pos : pos;
|
||||
}
|
||||
|
||||
type unop = U_not | U_neg
|
||||
|
||||
@@ -164,7 +176,8 @@ let buf_eff_atom b = function
|
||||
names
|
||||
|
||||
let rec buf_ty b = function
|
||||
| T_named { name; args; _ } ->
|
||||
| T_named { modl; name; args; _ } ->
|
||||
let name = match modl with None -> name | Some m -> m ^ "." ^ name in
|
||||
if args = [] then Buffer.add_string b name
|
||||
else (
|
||||
Buffer.add_string b ("(" ^ name);
|
||||
@@ -202,7 +215,8 @@ let rec buf_pattern b = function
|
||||
| P_wild _ -> Buffer.add_char b '_'
|
||||
| P_lit (l, _) -> buf_lit b l
|
||||
| P_bind (n, _) -> Buffer.add_string b n
|
||||
| P_ctor { name; args; _ } ->
|
||||
| P_ctor { modl; name; args; _ } ->
|
||||
let name = match modl with None -> name | Some m -> m ^ "." ^ name in
|
||||
Buffer.add_string b ("(" ^ name);
|
||||
List.iter
|
||||
(fun p ->
|
||||
|
||||
Reference in New Issue
Block a user