Files
coollang/samples/04_enum_match_interface.cool
T
coolguyandClaude Opus 5 6bfdcaa0d6 Mini Shell: 네 번째 개밥, 보안 구멍 셋, 누수 lint
Mini Shell은 앞의 셋이 못 건드린 모양을 친다 — 파이프 하나는 끝이 둘이고
각각 다른 자식에게 간다. 부모에게 아무것도 안 남고 어느 블록에도 묶이지
않는다. 가장 어려운 자원 코드가 렉시컬하지 않다.

파싱을 자원에서 떼어 놓아 개밥이 처음으로 실제로 돈다 (test 5/5 통과).

보안 정리 (ii)의 구멍 셋 — 전부 "부분 move가 없다"는 하나의 규칙이
닿아야 할 자리가 비어 있던 것:
- 열거형 생성자가 인자를 소비하지 않았다. Some(f)를 두 번 쓰면 복제됐고,
  LRU가 쓰는 우회(affine 값을 열거형으로 나르기)가 그래서 무의미했다
- 소유한 열거형을 두 번 분해할 수 있었다. match가 scrutinee를 늘 빌려서
  조각만 owned로 나갔다 — 같은 파이프에서 같은 fd를 두 번 꺼낼 수 있었다
- 점 왼쪽을 이름 해소가 검사하지 않았다. Nonsense.whatever(1)이 통과했고
  samples 셋(02, 04, 06)이 이 구멍에 기대고 있었다 (D1과 같은 병)

누수 lint를 넣었다. ?와 return 자리에서 소유하고 있고 아직 안 넘긴 affine
값을 말한다. 저장소 전체 네 곳, 오탐 0건 — naive 판만 걸리고 careful 판은
조용하다. 타입 층 정책은 그대로다 (오용 금지, 누수 허용).

결정: resource라는 새 종류는 넣지 않는다. capability가 이미 그것이고
own self가 정리를 말한다. with는 미룬다 — 두 갈래 중 고르기에 데이터가
부족하고, 셸이 with가 닿지 않는 모양을 보여줬다.

List.rest 추가 (첫 원소를 뺀 나머지).

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

50 lines
1.3 KiB
Plaintext

// 04. enum 정의 본문이 interface surface에 들어가는 이유
//
// variant 추가가 downstream exhaustive match를 깨뜨리는 경로.
import "cool.dev/std/string" as String
import "cool.dev/std/int" as Int
// 거절 코드. 예전에는 어디에도 없는 이름이었고 Code.show가 조용히
// 통과했다 — 이름 해소가 점 왼쪽을 검사하지 않아서다.
pub copyable struct Code {
value: Int,
}
pub fn show_code(c: Code) -> String {
Int.show(c.value)
}
pub enum PayError {
Declined(Code),
Network(Retryable),
Fraud,
}
pub copyable struct Receipt {
id: ReceiptId,
amount: Money,
}
// exhaustive match. PayError에 variant가 추가되면 여기가 compile error가 된다.
pub fn is_retryable(e: PayError) -> Bool {
match e {
Declined(_) => false,
Network(r) => r.retryable,
Fraud => false,
}
}
pub fn describe(e: PayError) -> String {
match e {
Declined(code) => String.concat("declined: ", show_code(code)),
Network(_) => "network",
Fraud => "fraud",
}
}
// 재수출. hash 입력은 이름 목록이 아니라 해소된 정의 본문이다.
// 전용 키워드를 쓴다 — "처음 내보내기"와 의미가 다르고, hash 전파를 동반한다.
reexport PayError
reexport Receipt