LISP:在从文件中读取游戏板时格式化读取线的输出

use*_*180 1 lisp common-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
Run Code Online (Sandbox Code Playgroud)

我是LISP的新手.有人可以帮我格式化这些线来打印确切的板:

+ + +
 3 3
+ + +

+ + +
Run Code Online (Sandbox Code Playgroud)

Sta*_*yev 6

输入

显然,您正在尝试将带有CRLF分隔行的DOS文本文件提供给Lisp实现,该实现假定这些行以Unix方式进行LF分隔.请注意,read-line 剥离换行符,因此在我们的情况下,LF被剥离,但CR被视为普通字符,因此保留在字符串中.

换行符是特定于平台的,因此依赖于Lisp的实现.更重要的是,似乎asdf和asdf编码都没有解决这个问题.我看到它的方式你有以下选择:

  • 手动修剪CR,例如:

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

  • 使用航空自卫队的职能之一slurp-stream-stringslurp-stream-lines;
  • 使用一些特定于实现的机制来指定编码;
  • 将您的文本文件转换为Unix格式.

产量

如前所述,PRINT实际上是一个人类可读的序列化.CLHS页面上有一堆用于WRITE的打印功能,当然还有FORMAT.为了输出字符串,您还可以使用WRITE-STRING(不附加换行符)或WRITE-LINE(带换行符).

UPD

实际上,UIOP(不是ASDF!)根据其docstring导出实用程序函数UIOP:STRIPLN,它执行以下操作:

"从任何结尾的CR,LF或CRLF中删除一个字符串X.返回两个值,剥离的字符串和被剥离的结尾,或者原始值和NIL,如果没有发生剥离.由于我们的STRCAT接受NIL作为空字符串指示符,传递给STRCAT的两个结果总是重新构成原始字符串"