Постоянное перенаправление stdout в файл в Common Lisp (CCL)
Я пытаюсь перенаправить стандартный вывод stdout в файл, но все примеры, которые я могу найти по этому поводу, включают в себя выполнение внутри let или внутри with-open-file с использованием стандартного глобального вывода. Есть ли способ сделать приложение редиректом?
РЕДАКТИРОВАТЬ: Вот как я пытался сделать перенаправление со стандартным выводом:
(Setf *log* (open "/Users/Mike/Desktop/some.txt" :direction :output :if-exists :append))
(Setf *standard-output* *log*)
(print "Test")
Это останавливает вывод в REPL, но ничего не отображается в файле (который существует и виден probe-file
) из печати вызова.
РЕДАКТИРОВАТЬ: я пытался использовать функцию Dribble:
(Dribble "/Users/Mike/Desktop/some.txt")
(format t "hello")
Но я получаю следующую ошибку:
Ошибка: нет применимого метода для универсальной функции: #STANDARD-GENERIC-FUNCTION CCL::STREAM-SET-COLUMN #x30200006557F при вызове с аргументами: (# 0) Во время выполнения: # в процессе Listener(11). Введите cmd-/ для продолжения, cmd-. прервать, cmd-\ для получения списка доступных перезапусков. Если продолжение: попробуйте позвонить еще раз. для других вариантов.
1 ответ
Я думаю, что ваша проблема связана с буферизацией. Пытаться force-output
:
(force-output *log*)
Обратите внимание, что закрытие потоков автоматически сбрасывает буферы, а lisps обычно закрывает потоки при нормальном выходе, так что на самом деле ничего не теряется, просто требуется время, чтобы появиться на диске.
Кроме того, обратите внимание, что взаимодействие Common Lisp REPL выполняется для множества различных потоковых переменных, а не только для одной (хотя многие из них являются псевдонимами других).
На самом деле, если вы хотите сохранить журнал вашего сеанса (т.е. сохранить REPL на экране и сохранить расшифровку в файл), стандартное средство предоставляется dribble
- попытайся!