#lisp #common-lisp
#lisp #common-lisp
Вопрос:
Я пытаюсь использовать функцию чтения из строки, однако я не могу сделать орел из хвостов с его помощью.
Если я правильно понимаю документацию, если второй параметр не равен true, то несбалансированное выражение в предоставленной строке не должно вызывать ошибку. Однако, если попробовать, я получаю:
> (чтение из строки «(1 2» t ‘EOF)
Условие типа: Неожиданный конец файла в #<поток ввода строки из «(1 2»>.
Доступные перезапуски:
- (ПЕРЕЗАПУСК-ВЕРХНИЙ УРОВЕНЬ) Вернитесь к 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. Ошибка сигнализируется, если конец подстроки находится в середине незавершенного объекта.