Common Lisp-单行打印/返回/单行计数器/格式
我对在CommonLisp中实现“单行”计数器/进度条感兴趣。没什么特别的,就像: => ==> ==> ... 等等 然后让它重新开始。或者计算我访问过的节点数 但是,我想在一行上完成这一切,并清除以前打印的字符。例如,在Python中,它类似于:Common Lisp-单行打印/返回/单行计数器/格式,lisp,format,progress-bar,common-lisp,Lisp,Format,Progress Bar,Common Lisp,我对在CommonLisp中实现“单行”计数器/进度条感兴趣。没什么特别的,就像: => ==> ==> ... 等等 然后让它重新开始。或者计算我访问过的节点数 但是,我想在一行上完成这一切,并清除以前打印的字符。例如,在Python中,它类似于: for i in range(0,1000): print "\r",i," " 这将计算在内,但将所有内容保持在一行上,同时在任何给定迭代之前清除该行上打印的所有内容 我知道在lisp中有(格式t“text”#\return
for i in range(0,1000):
print "\r",i," "
这将计算在内,但将所有内容保持在一行上,同时在任何给定迭代之前清除该行上打印的所有内容
我知道在lisp中有(格式t“text”#\return)
,但这似乎不起作用
有人知道我该怎么做吗?(我环顾四周,似乎什么也没找到。)
谢谢
安德鲁
编辑:
我找到了解决办法。您需要为要处理的\return
添加指令(通用“~a
”已生效):
(loop for i from 0 to 50000 do
(format t "~A~A " #\return i))
这将计算到50000,你可以看着它这样做。因此,它适用于您可能希望重用单个输出行的任何其他情况
(defun show-progress (len)
(format t "=")
(dotimes
(i len)
(format t "="))
(format t ">")
)
执行此函数后,您应该会看到以下输出:
CL-USER> (show-progress 10)
===========>
NIL
这就是如何在同一行上打印一个不断增长的“箭头”(发送退格字符的次数与打印等号字符的次数相同,会将其删除)
注意:这在SLIME/SWANK组合中不起作用,因为它们不会处理可能被解释为命令的“特殊”字符,相反,它们将对其进行扬抑转义,这一个将打印为一束^H
,但如果您在终端中运行此操作,它将清除箭头并重新打印
这就是使用
格式通过重复相同字符来调整字符串的方法:
(defun progress-bar ()
(dotimes (i 100)
(format t (format nil "~~1,1,~d,'=:<>~~>" i))
(finish-output)
(sleep 1)
(dotimes (j (1+ i))
(write-char #\Backspace))))
例如。是的,这会起作用,但如果你想把它重新包装起来(比如说,你不是在测量进度,而是在视觉上分散注意力),那也不会起作用。@wvxvw:我想他想打印一份报税表,而不是换行。@andrewm921请发布你的答案,接受它并指定您使用的是哪个lisp实现和平台。这并不是很好,因为您使用了i字符串。如果您想(太?)聪明,那么可以使用format指令打印i字符。
(defun progress-bar ()
(dotimes (i 100)
(format t (format nil "~~1,1,~d,'=:<>~~>" i))
(finish-output)
(sleep 1)
(dotimes (j (1+ i))
(write-char #\Backspace))))
(defun progress-bar ()
(let ((arrow (make-array
101
:element-type 'character
:initial-element #\>
:fill-pointer 1)))
(dotimes (i 100)
(format t arrow)
(setf (fill-pointer arrow) (+ i 2)
(aref arrow i) #\=
(aref arrow (1+ i)) #\>)
(finish-output)
(sleep 1)
(dotimes (j (1+ i))
(write-char #\Backspace)))))
(defun progress-bar ()
(let (source)
(dotimes (i 100)
(format t "~{~c~}>" source)
(push #\= source)
(finish-output)
(sleep 1)
(dotimes (j (1+ i))
(write-char #\Backspace)))))