Files
coollang/dogfoods
coolguyandClaude Opus 5 d85816abae own: 함수 타입과 클로저 파라미터의 소유권 — 구멍이 숨기던 버그가 나왔다
D5를 고친다. 함수 타입에 own을 적을 수 없어 "소유권을 가져가는 클로저"를
표현할 수 없었고, move 검사기가 클로저 파라미터를 무조건 소유로 봐서 고차
경계에서 소유권 검사가 뚫려 있었다.

클로저 파라미터의 소유권은 리터럴이 스스로 적는다. 타입은 기대 타입에서
읽어오지만 소유권은 읽어오지 않는다 — move 검사는 타입 검사와 별도 순회라
타입을 모르고, 소유권은 타입보다 결과가 크기 때문이다.
unify는 정확히 일치를 요구한다. 방향을 다루려면 부분 타입이 필요하고 없다.

그리고 구멍이 자기가 숨긴 버그를 덮고 있었다. std/list.cool의 fold가
f: fn(acc, a) -> acc 로 적혀 있었는데 틀렸다 — 누적자는 매 단계 소비되고
새것으로 바뀌므로 own이다. 빌림으로 적혀 있어 affine 값을 fold로 실어나를
수 없었는데, 클로저 파라미터를 소유로 봤으니 아무 오류도 안 났다.
고치니 samples/app이 즉시 깨졌고, own을 붙여 고쳤다.

남은 한계를 기록했다: move 검사는 타입이 없어 제네릭을 통과해 affinity를
보지 못한다. 양쪽 다 표기가 없으면 통과한다. 근본 해법은 두 순회를 합치는
것이고 v0에서는 하지 않는다.

대가도 기록했다: own이 흔해진다. fold가 항상 요구하므로 copyable 누적자에도
붙는다. 표기의 신호가 약해지는지 지켜본다.

문법 먼저 고치고 대조 장치가 파서를 지적하게 했다. 지금은 문장 500개,
파일 29개 모두 갈림 0건.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019ZVDeU6KLuUVL3gs18Hm3E
2026-08-30 19:06:17 +09:00
..

dogfoods — 실제 유스케이스로 언어를 압박한다

samples/가 검사기를 시험한다면 여기는 언어가 실제 문제를 표현할 수 있는지를 시험한다. 성격이 다르므로 폴더를 나눈다.

방법

프로그램을 쓰되 돌리지 않는다. std-draft/에 런타임이 구현한다고 가정한 선언을 두고, 그것에 대고 실제 프로그램을 쓴다.

"가상"이 아니다. std/*.cool이 원래 본문 없는 선언이므로 실행만 빼고 전부 진짜로 검사된다:

lexer ✓  parser ✓  이름 해소 ✓  타입 ✓  effect ✓
capability ✓  move/affinity ✓  소진성 ✓  interface hash ✓
run ✗

종이 스케치가 아니라 컴파일러가 검증한 설계다.

합격 기준

① coolc check       exit 0
② 모듈이 실제로 해소될 것

②가 없으면 ①이 공허하다. import가 조용히 해소되지 않으면 그 모듈의 이름이 전부 불투명해지고, 검사기는 "모르는 것을 틀렸다고 말하지 않는다"는 원칙에 따라 무엇이든 통과시킨다. 실제로 첫 시도에서 이 일이 일어났다 (D1 참고).

규율

std-draft의 선언은 독립적으로 정당화되어야 한다.

  • 지금 런타임이 가진 권한으로 구현 가능할 것
  • effect를 전부 선언할 것
  • 실패 양상을 선언하는 자리에서 정할 것 — 무엇이 Result이고 무엇이 crash인지
  • 없는 언어 기능에 기대지 말 것. 필요하다는 것이 드러나면 그것이 발견이지 지름길이 아니다

프로그램이 예뻐 보이도록 API를 발명하면 아무것도 배우지 못한다.

한계

이 기준이 증명하는 것은 표현 가능성이지 의미론의 정확성이 아니다. check가 통과한다고 그 프로그램이 옳게 도는 것은 아니다 — 돌려본 적이 없다.

세트

압박하는 곳 상태
1 Mini Shell 소유권 / OS 핸들 대기
2 Atomic File Updater 자원 수명, 실패 경로 완료
3 Process Supervisor 실패 위상 대기
4 Reverse Proxy 취소, backpressure 대기
5 TCP Server 규모의 API 모양 대기
6 DB Pool lease, 자원 정리 대기
7 Resource Exhaustion 실패 의미론의 최악 조건 미룸 — 런타임 속성이라 안 돌리면 알 수 없다. 언어 층 질문("무엇이 Result이고 무엇이 crash인가")은 std-draft 규율로 흡수했다

순서는 자원 모델(2, 6, 1) → 동시성·취소(3, 4, 5)다. 2번을 먼저 둔 이유는 동시성을 안 섞고 자원 모델만 시험할 수 있는 유일한 것이기 때문이다.

발견은 FINDINGS.md에 쌓고, 확정된 결정은 docs/thesis.md로 올린다.