2015-07-29 5 views
3

Вопрос гласит все. Мне интересно, потому что clhs для make-string-input-stream не указывать, и код примера не показывает закрытие. Но расширение with-input-from-string действительно закрывает поток.Должен ли я закрывать поток, созданный с помощью строки-ввода-потока

(with-input-from-string (stream "hallo") 
) 

становится

(LET ((#:STRING1525 "hallo")) 
    (LET ((STREAM (MAKE-STRING-INPUT-STREAM #:STRING1525 0))) 
    (MULTIPLE-VALUE-PROG1 (UNWIND-PROTECT (PROGN) (CLOSE STREAM))))) 
+0

Будьте осторожны с расширениями макросов, по крайней мере, скажите нам, какую реализацию вы использовали. Ничто в стандарте не требует расширения или аналогичного. Реализация могла бы использовать все внутренние символы, такие как непрозрачные, нестандартные специальные операторы, или встроить тело стандартных функций. – acelent

+0

Я добавил реализацию, используемую в тегах – Sim

ответ

4

сборщик мусора будет заботиться о его очистки, если вы не закроете его перед повторным использованием переменной. Поскольку потоки ввода строки не имеют побочных эффектов, CLOSE не выполняет никаких необходимых действий.

Это будет отличаться для выходных потоков, поскольку для устранения побочных эффектов может потребоваться закрытие потока, например, промывка последнего бита буферизованного вывода (хотя вы могли бы сами позвонить и FORCE-OUTPUT or FINISH-OUTPUT).

+0

. Нельзя ли утечка обработчика потока, не закрывая поток? – Sim

+0

Только в том случае, если вы сохраните поток вживую, ссылайтесь на него где-нибудь в переменной. Это похоже на любые другие данные Lisp. – Barmar

+2

Макросы делают это, вероятно, потому, что приятно не скучать о ресурсах. Если это очень важно, следует, вероятно, продолжать использовать макросы 'with *'. Есть много вопросов о недостающих данных из не правильно закрытых выходных потоков/файлов на этом сайте, поэтому получение хорошей привычки может быть не плохой идеей. – Sylwester