Различное поведение макросов в SLIME и SBCL - PullRequest
0 голосов
/ 08 мая 2020

Мне нужно написать несколько функций для сохранения данных и для уменьшения дублирования кода, я решаю написать макрос:

(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 будет ждать ввода пользователя немедленно, а затем распечатать оба оператора печати одновременно, т.е.

«Введите путь для сохранения файла:»

«Каталог не существует»

Как это исправить?

...