// 13. 두 lint — 미사용 import와 effect 과잉 선언 // // 둘 다 취향 문제가 아니라 비용 문제다. // // 미사용 import: 쓰지도 않는 모듈의 시그니처가 바뀌면 이 모듈이 재검사된다. // 증분 루프의 비용을 아무 이유 없이 넓히는 선언이다. // // effect 과잉 선언: 선언한 effect를 수행하지 않으면 호출자는 하지도 않는 // 일에 대한 의무를 진다 — 자기 effects 절을 넓히거나 capability를 받아온다. // 시그니처는 실제보다 좁아도 안 되고 넓어도 안 된다. import "cool.dev/std/list" as List // ERROR: List을(를) 가져왔지만 쓰지 않습니다 pub capability Db { fn read(id: Int) effects {Db.read} -> Int fn write(id: Int) effects {Db.write} } // Db.write는 선언만 하고 수행하지 않는다. pub fn only_reads(db: Db, id: Int) effects {Db.read, Db.write} -> Int { db.read(id) } // ERROR: only_reads은(는) Db.write을(를) 선언했지만 수행하지 않습니다 // 정확히 선언하면 통과한다. pub fn honest(db: Db, id: Int) effects {Db.read} -> Int { db.read(id) } // effect 변수가 있으면 판정하지 않는다. e에 무엇이 묶일지는 호출 지점이 // 정하고, 본문만 보고는 알 수 없다 — 모르는 것을 틀렸다고 말하지 않는다. pub fn polymorphic[e: effects](f: fn() effects e) effects e { f() }