ошибка чтения в clozure common lisp

есть файл s-выражений, который включает символы иностранного языка, которые я читаю следующим образом:

(defun test (file)
  (with-open-file (stream file)
    (loop while (read stream nil nil))))

В ccl 1.8 читает файл без ошибок, а в 1.9 выдает ошибку:

? (test "/users/markklein/desktop/naples.text")
> Error: Reader error: Illegal symbol syntax.
> While executing: CCL::%PARSE-TOKEN, in process Listener(5).
> Type cmd-. to abort, cmd-\ for a list of available restarts.
> Type :? for other options.
1 > 

У кого-нибудь есть идеи, что происходит не так, и как это исправить? Файл данных могу выслать по запросу.


person user1279806    schedule 17.06.2014    source источник
comment
Файл данных могу выслать по запросу. Пожалуйста, включите его в вопрос. Но сузьте проблему только до текста, который вызывает проблему. Например, вырезать половину файла; если проблема осталась, то она в оставшейся половине, в противном случае верните половину и выньте другую половину. Вы должны быть в состоянии добраться до проблемного s-выражения. Важно, чтобы вы предоставили полный пример, то есть достаточно, чтобы мы могли воспроизвести проблему, и минимальный пример, то есть как можно меньше лишнего, поскольку это просто мешается.   -  person Joshua Taylor    schedule 17.06.2014
comment
Кроме того, часто попытки создать минимальный полный пример достаточно, чтобы показать вам, в чем проблема.   -  person Joshua Taylor    schedule 17.06.2014
comment
article.gmane.org/gmane.lisp.openmcl.devel/9193 ?   -  person Ben Hyde    schedule 17.06.2014
comment
@BenHyde, я думаю, это нужно как-то опубликовать как ответ.   -  person Mark Karpov    schedule 17.06.2014
comment
Обычно file-position будет восстанавливаемой информацией, когда у вас есть reader-error на file-stream. Я бы попробовал вариант :? и посмотрел, не выглядит ли что-нибудь многообещающим. Если вы получили file-position, вы можете открыть файл в своем любимом редакторе и перейти к этому персонажу. В противном случае я бы нашел неисправное s-exp, завернув вызов read в вызов print.   -  person m-n    schedule 18.06.2014


Ответы (1)


Бен Хайд отметил в комментарий, что R. Мэтью Эмерсон рассказал об этой проблеме в списке рассылки Clozure, указав, что внешний формат Clozure CL по умолчанию был изменен на :utf-8. В результате он предложил такой вариант:

Мы изменили внешний формат по умолчанию на :utf-8 в версии 1.9. Это, вероятно, сбивает вас с толку. Попробуйте явно указать соответствующий внешний формат, например,

(defun test (file)
  (with-open-file (stream file :external-format :iso-8859-1)
    (loop while (read stream nil nil))))
person Community    schedule 17.06.2014