REPL中读取文件显示^M的原因

关于为啥从文件中读取内容,在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碰见1310产生了个平常不太一样的效果。





;;;分别用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))


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值