(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))))
如果您喜欢更复杂的方式(确实是几个字符短!)。而且,哦,等等,它创建的字符串与原来的字符串一样多……哎呀 :)
不幸的是,我不知道一个很好的格式指令可以明确地重复一个字符,所以上面的方法似乎是最简单的方法,但是,还有其他有趣的方法可以有效地做到这一点。
(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)))))
例如。