Объркан от условието за край на файла в обикновения lisp

не може да чете текстов файл.

ПРОЧЕТЕТЕ: входен поток #1=# е достигнал своя край [Условие от тип SYSTEM::SIMPLE-END-OF-FILE]

какво означава "е достигнал своя край".


person 1.618    schedule 15.12.2009    source източник
comment
Кога става това? Какъв файл се опитваш да прочетеш?   -  person itowlson    schedule 15.12.2009


Отговори (2)


Вижте документацията в HyperSpec:

http://www.lispworks.com/documentation/HyperSpec/Body/f_rd_rd.htm

По подразбиране READ, READ-CHAR и подобни функции ще сигнализират за състояние от тип END-OF-FILE, когато няма повече данни за четене от потока.

Ако искате вместо това да върне конкретна стойност, когато се опитва да чете след края на потока, ще трябва да предадете nil към параметъра eof-error-p на функцията и стойност, символ или ключова дума към параметъра eof-value на функция; това са данните, които ще получите обратно, когато бъде достигнат краят на файла/потока.

Например, ако четете знаците поотделно от част от текст:

(with-open-file (s somefile :direction :input)
  (do ((c (read-char s nil :eof)
          (read-char s nil :eof)))
    ((eql c :eof) 'done)
    (process-char c)))
person Jorge Gajon    schedule 15.12.2009
comment
Също така имайте предвид, че READ анализира прочетения текст в Lisp обекти и ако текстът не е валиден, ще бъде сигнализирано състояние на грешка. - person Jorge Gajon; 15.12.2009

Това означава, че сте прочели всички налични данни на мястото, към което сте отворили потока, и след това сте се опитали да прочетете още.

person bmargulies    schedule 15.12.2009