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
21 lines
757 B
Plaintext
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)
|
|
}
|