关于为啥从文件中读取内容,在REPL中显示会有^M 呢?因为你比较了ascii以后,你会发现当按byte查看他到底在那个位置输出了什么的时候,也就是在1013的时候出现了这个字符,然后我就怀疑的是不是文档的回车换行在显示的时候有问题。接下来我就开始单个测试读取字符LR 和CR。方式是按write-byte方式分别读进去一个10,然后按read-char的方式读进来,并且输出显示。最后发现当读进去13的时候出现了这个符号。
然后我就怀疑是不是REPL buffer遇到13就会变成^M,也就是说在REPL buffer里面换行只是用到10。现在好好考虑一下就是lisp读取一个含有1013的串,然后lisp把他自动匹配成了换行和^M,但是lisp源文件中同样有换行,为啥在lisp中显示仍然正常呢?我当时想的就是应该源文件中或许换行就是一个字符10执行得到的,所以我就开始读取源文件的byte流。最总发现源文件中的回车换行仍旧是两个字符实现的,其实好好想一下,应该就是这样因为.lisp文件本身是windows里面得东西,所以得按照它的文件规则,现在关键是REPL是如何读取源文件的。因为现在文件本来是1013,再显示的时候是换行和^m。既然说要检验是不是REPL碰见10就会实现换行的功能。于是我就一个一个字符的输入,第一次中间含有10,然后再用char读出来,在REQL中显示了成功换行的效果;第二次我加入了13,最总输出为^m。所以说当读文件在reql中显示的时候单独的字符10就可以实现换行。
在lisp中编码仍旧是ASCII,只是slime碰见13和10产生了个平常不太一样的效果。
;;;分别用read-char/read-line来读取,都含有^M问题
(let ((in (open "d:/emacs/io3.db")))
(loop for c = (read-char in nil)
while c
do(format t "~a" c))
(close in))
(let ((in (open "d:/emacs/io3.db" :element-type '(unsigned-byte 8))))
(loop for c = (read-byte in nil)
while c
do(format t "~a" c))
(close in))
(let ((in (open "d:/emacs/io3.db")))
(loop for line = (read-line in nil)
while line
do(format t "~a~%" line)))
;;;当只处理10和13中的一个字符时,看repl有如何反应。
(with-open-file (out "d:/emacs/io4.db" :direction :output
:element-type '(unsigned-byte 8)
:if-exists :supersede)
(write-byte 10 out))
(with-open-file (in "d:/emacs/io4.db")
(format t "~s" (read-char in nil)))
(with-open-file (in "d:/emacs/io4.db")
(format t "~a" (read-char in nil)))
(with-open-file (out "d:/emacs/io4.db" :direction :output
:element-type '(unsigned-byte 8)
:if-exists :supersede)
(write-byte 13 out))
(with-open-file (in "d:/emacs/io4.db")
(format t "~s" (read-char in nil)))
(with-open-file (in "d:/emacs/io4.db")
(format t "~a" (read-char in nil)))
;;;单独输入10
(with-open-file (out "d:/emacs/io4.db" :direction :output
:element-type '(unsigned-byte 8)
:if-exists :supersede)
(write-byte 97 out)
(write-byte 98 out)
(write-byte 10 out)
(write-byte 102 out))
;;;确认10读进来了
(let ((in (open "d:/emacs/io4.db" :element-type '(unsigned-byte 8))))
(loop for c = (read-byte in nil)
while c
do(format t "~a" c))
(close in))
;;;最后实现了换行的效果
(let ((in (open "d:/emacs/io4.db")))
(loop for c = (read-char in nil)
while c
do(format t "~a" c))
(close in))
;;;单独输入13,显示^M的效果
(with-open-file (out "d:/emacs/io4.db" :direction :output
:element-type '(unsigned-byte 8)
:if-exists :supersede)
(write-byte 97 out)
(write-byte 98 out)
(write-byte 13 out)
(write-byte 102 out))
;;;确定是否把13读入进来了
(let ((in (open "d:/emacs/io4.db" :element-type '(unsigned-byte 8))))
(loop for c = (read-byte in nil)
while c
do(format t "~a" c))
(close in))
;;;显示结果
(let ((in (open "d:/emacs/io4.db")))
(loop for c = (read-char in nil)
while c
do(format t "~a" c))
(close in))