File I/O — явная host boundary с Result-returning acquisition/operations, opaque resource value и намеренно малым portable contract.
Канонический контракт
open(path) возвращает Result<File,string>. File имеет read() -> Result<string,string>, write(string) -> Result<(),string> и close() -> (). File opaque и non-comparable. Cleanup выражается lexical defer или точным File-only using; общего resource protocol они не создают.
Публичная поверхность
Расширенный host inventory содержит input, FS.readText/writeText/readBytes/writeBytes/list, Path helpers и virtual std.fs/std.io. Bytes предоставляет явные UTF-8, hex, Base64, slice, length и array conversion. Каждый host effect ограничен объявленной host/profile surface.
Наблюдаемое поведение
Acquisition/read/write failures — значения Result. using приобретает один раз, регистрирует close после успеха, создаёт одно immutable child-scope File, выполняет поздние body defers раньше close и закрывает при обычном lexical control exit. Capture не продлевает using scope; позднее замыкание видит значение после implicit close boundary.
Текущая поддержка
File, FS, std.fs и std.io доступны в средах, которые предоставляют файловую систему. Они не дают доступ к остальным API операционной системы, переменным окружения, процессам, сети или базам данных.
Ограничения и исключения
Не специфицированы append modes, binary File overloads, buffering, permissions, async I/O, user disposables, multi-resource using, cancellation cleanup, module lifetime, ordinary-fault finalization и portable post-close/repeated-close. Ошибки обрабатываются Result, не exception.
Пример
function append(path: string, text: string) -> Result<(), string> {
let file = open(path)?
defer { file.close() }
file.write(text)?
return Ok(())
}