Как обрабатывать ошибку конца файла при использовании чтения из строки?

#lisp #common-lisp

#lisp #common-lisp

Вопрос:

Я пытаюсь использовать функцию чтения из строки, однако я не могу сделать орел из хвостов с его помощью.

Если я правильно понимаю документацию, если второй параметр не равен true, то несбалансированное выражение в предоставленной строке не должно вызывать ошибку. Однако, если попробовать, я получаю:

> (чтение из строки «(1 2» t ‘EOF)

Условие типа: Неожиданный конец файла в #<поток ввода строки из «(1 2»>.

Доступные перезапуски:

  1. (ПЕРЕЗАПУСК-ВЕРХНИЙ УРОВЕНЬ) Вернитесь к REPL верхнего уровня.

Нарушено в SI: БАЙТ-КОДАХ. [Вычисление: (ЧТЕНИЕ ИЗ СТРОКИ «(1 2» …)] В: #<процесс ВЕРХНЕГО УРОВНЯ>.

>> 1

1

>> (чтение из строки «(1 2» nil ‘EOF)

Отладчик получил ошибку типа: Неожиданный конец ФАЙЛА в #<поток ввода строки из «(1 2»>. Ошибка сброшена.

Независимо от того, что я отправляю, я всегда получаю сообщение об ошибке.

Я использую ECL 15.3.7

Ответ №1:

eof-error-p eof-value Необязательные аргументы и контролируют результат, если вы нажмете на конец строки, прежде чем вообще что-либо найдете. Так что:

 > (read-from-string "")

Error: ...
  

в то время как

 > (read-from-string "" nil 'foo)
foo
0
  

Если конец строки частично проходит через неполный объект, всегда сигнализируется ошибка. Спецификация понятна, хотя это довольно далеко от записи:

Если конец предоставленной подстроки появляется до того, как объект может быть прочитан, выдается сообщение об ошибке, если значение eof-error-p равно true. Ошибка сигнализируется, если конец подстроки находится в середине незавершенного объекта.