Вот допустим есть транслятор который читает файл. Он натыкается на ошибку и кидает condition. Позицию ошибки в файле он определяет по номеру строки и номеру символа от начала строки. Чтобы подсветить ошибку в логах программа прочитает кусок файла с ошибкой - для этого она ещё раз откроет файл на чтение и, прочитав, закроет его. Первоначальное открытие файла сохраняет своё состояние из-за особенностей обработки ошибок в CL - после обработки работа программы продолжается в том же самом режиме.
Вот я попробовал сейчас из линукса вот такое сделать:
CL-USER> (let ((file #P"file.txt"))
(with-open-file (*standard-input* file)
(with-open-file (in file)
(read-char *standard-input*)
(read-char in)
nil)))
NIL
CL-USER>
и вроде никаких проблем.
Я помню винду с её жуткими придирками по поводу занятости файлов работами в приложениях и есть вопрос: а насколько будут такие фокусы кросплатформенны?