我有兴趣在Common Lisp中实现“单行”计数器/进度条。没什么好看的,就像这样:
=>
==>
===> ......等等。
然后让它重新开始。或者可以计算我访问过的节点数量。
但是,我想在一行中完成所有操作,并清除以前打印的字符。例如,在Python中,它将类似于:
for i in range(0,1000):
print "\r",i," "
然后将计算,但将所有内容保留在一行上,同时在任何给定的迭代之前清除该行上打印的所有内容。
我知道在lisp中有(format t "text" #\return)
,但这似乎不起作用。
有谁知道我怎么做这个? (我环顾四周,似乎找不到任何东西)。
谢谢,
安德鲁
修改 的
我找到了解决方案。您需要为要处理的~A
添加一个指令(通用“#\return
”工作):
(loop for i from 0 to 50000 do
(format t "~A~A " #\return i))
这将达到50,000,您可以观看它。因此,它适用于您可能希望重用单个输出行的任何其他情况。
答案 0 :(得分:1)
(defun show-progress (len)
(format t "=")
(dotimes
(i len)
(format t "="))
(format t ">")
)
执行此功能后,您应该看到此输出:
CL-USER> (show-progress 10)
===========>
NIL
答案 1 :(得分:0)
(defun progress-bar ()
(dotimes (i 100)
(format t "~a>" (make-string i :initial-element #\=))
(finish-output)
(sleep 1)
(dotimes (j (1+ i))
(write-char #\Backspace))))
这就是你可以在同一行上打印一个不断增长的“箭头”的方法(发送退格字符的次数与打印时相同的字符将删除它)。
请注意,这不会在SLIME / SWANK组合中起作用,因为它们不会处理可能被解释为命令的“特殊”字符,而是会旋转它们,这个字符会打印为^H
的一串,但是如果你在终端中运行它,那么它将清理箭头并重新打印它。
这就是你通过重复相同的字符format
字符串来实现它的方式:
(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))))
如果你喜欢更复杂的方式(确实有几个字符更短!)。哦,等等,它创建的字符串与原始字符串一样多... oops:)
不幸的是,我不知道一个好的格式指令会明显地重复一个字符,所以上面似乎是最简单的方法,但是,有其他有趣的方法来做到这一点有效
(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)))))
例如。