Мне нужно написать несколько функций для сохранения данных и для уменьшения дублирования кода, я решаю написать макрос:
(defmacro with-path (var &body body)
(let ((path (gensym)))
`(progn
(print "Enter path to save a file:")
(let ((,path (read-line)))
(if (null (directory ,path))
(print "Directory doesn't exist")
(let ((,var ,path))
,@body))))))
Когда я использую его в SLIME, он работает, как ожидалось, т.е. сначала напечатайте "Enter path to save a file:"
и затем напечатайте сообщение об ошибке или аргумент тела eval.
Но у меня совершенно другое поведение при использовании SBCL в терминале (проверьте urxvt на Arch и на терминале macos по умолчанию). Например, если я запускаю (with-path p (print p))
, SBCL будет ждать ввода пользователя немедленно, а затем распечатать оба оператора печати одновременно, т.е.
«Введите путь для сохранения файла:»
«Каталог не существует»
Как это исправить?