Files
coollang/dogfoods/atomic-update/naive.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

21 lines
757 B
Plaintext

// 순진한 버전 — ?로 짧게 쓴 것.
//
// 처음 썼을 때 이 파일의 목적은 "통과한다는 사실을 보여주는 것"이었다.
// 이제 lint가 두 자리를 가리킨다 — write와 sync의 ?다. 그 둘에서 빠져나가면
// f가 닫히지 않는다. 타입 층에서는 여전히 오류가 아니다 (누수 허용).
import "../std-draft/fs" as Fs
import "cool.dev/std/string" as String
pub fn update(fs: Fs.Fs, path: String, contents: String)
effects {Fs.create, WriteFile.write, WriteFile.sync, WriteFile.close, Fs.rename}
-> Result[Unit, Fs.IoError] {
let tmp = String.concat(path, ".tmp")
let f = fs.create(tmp)?
f.write(contents)?
f.sync()?
f.close()?
fs.rename(tmp, path)?
Ok(unit)
}