我正在尝试从文本文件中读取该板,但在打印时它也会将换行符和引号都打印为:
(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 :(得分:6)
显然,您正在尝试将带有CRLF分隔行的DOS文本文件提供给Lisp实现,该实现假定这些行以Unix方式进行LF分隔。请注意read-line
剥离换行符,因此在我们的情况下,LF被剥离,但CR被视为普通字符,因此保留在字符串中。
换行符是特定于平台的,因此依赖于Lisp的实现。更重要的是,似乎asdf和asdf编码都没有解决这个问题。我看到它的方式有以下几种选择:
手动修剪CR。 G。像这样:
(string-right-trim '(\#Return) line)
slurp-stream-string
和slurp-stream-lines
; 如前所述,PRINT实际上是一个人类可读的序列化。 CLHS页面上有一堆用于WRITE的打印功能,当然还有FORMAT。为了输出字符串,您还可以使用WRITE-STRING(不附加换行符)或WRITE-LINE(换行符)。
UPD
实际上,UIOP(不是ASDF!)根据其文档字符串导出实用程序函数UIOP:STRIPLN,它执行以下操作:
“从任何结尾的CR,LF或CRLF中删除字符串X. 返回两个值,剥离的字符串和被剥离的结尾, 如果没有剥离,则原始值和NIL。 由于我们的STRCAT接受NIL作为空字符串指示符, 传递给STRCAT的两个结果总是重新组成原始字符串“
答案 1 :(得分:2)
从documentation可以看出,print
"产生的输出适合于读取"的输入。请改用format:
(format t "~a" line)