2014-11-02 1 views
0

Я пытаюсь читать доску из текстового файла, но при печати он также печать новой строки и перевернутые запятых как:LISP: форматирование вывода для чтения строки во время чтения настольной игры из файла

(with-open-file (stream "brd1.txt") 
    (do ((line (read-line stream nil) 
      (read-line stream nil))) 
     ((null line)) 
    (print line))) 

"+ + +^M" 
" 3 3 ^M" 
"+ + +^M" 
"  ^M" 
"+ + +" 
NIL 

Я новичок в LISP. Может кто-нибудь помочь мне отформатировать эти строки, чтобы напечатать точную плату, как:

+ + + 
3 3 
+ + + 

+ + + 
+0

Попробуйте использовать формат вместо печати – turingcomplete

+3

Пожалуйста, отправьте код, а не фотографии. – uselpa

ответ

2

Как вы можете видеть из documentation, print «производит вывод, пригодный для ввода для чтения». Используйте format вместо:

(format t "~a" line) 
+0

Но он не удаляет новую строку^М. Также он не печатает его как плату, а печатает все в одной строке. Какие-либо предложения? – user3505180

5

Входного

Видимо вы пытаетесь накормить текстовый файл DOS с CRLF-разделителями строк лисповской реализации, предполагающей линия будет LF-разделители в моде Unix. Обратите внимание, что read-lineразделяет строки новой строки, поэтому в нашем случае LF разделяются, но CR обрабатываются как обычные символы и, таким образом, остаются в строке.

Новые линии являются специфичными для платформы и, следовательно, зависят от реализации в Lisp. Более того, кажется, что ни asdf, ни asdf-encodings не затрагивают эту проблему. Как я вижу, у вас есть следующие варианты:

  • обрезать CR вручную e. г. как это:

    (string-right-trim '(\#Return) line)

  • использование одной из функций Asdf в slurp-stream-string и slurp-stream-lines;
  • использовать определенный механизм специфики реализации для указания кодировки;
  • преобразуйте текстовый файл в формат Unix.

Выходные

Как уже отмечалось, PRINT фактически читаемый человеком сериализации. На странице CLHS для WRITE есть куча функций печати, и, конечно же, FORMAT. Для вывода строки вы также можете использовать WRITE-STRING (без добавления новой строки) или WRITE-LINE (с новой строкой).

UPD

На самом деле UIOP (! Не Asdf) экспортирует функцию полезности UIOP: STRIPLN, которая выполняет следующие действия, в соответствии с его строку документации:

«Strip строка X из любого заканчивающегося CR, LF или CRLF. Возвратите два значения, лишенную строку и окончание, которое было лишено, или исходное значение и NIL, если не было снятия. Поскольку наш STRCAT принимает NIL как пустой указатель строки, два результата, переданные в STRCAT всегда восстанавливайте оригинальную строку "

+0

Спасибо. Я использовал текстовый файл DOS. Преобразование его в формат UNIX помогло. – user3505180

+0

Я хочу реализовать лучший первый поиск в этой настольной игре. Не могли бы вы предложить, как это сделать? – user3505180

Смежные вопросы