Common Lisp-单行打印/返回/单行计数器/格式

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

我对在CommonLisp中实现“单行”计数器/进度条感兴趣。没什么特别的,就像:

=>

==>

==> ... 等等

然后让它重新开始。或者计算我访问过的节点数

但是,我想在一行上完成这一切,并清除以前打印的字符。例如,在Python中,它类似于:

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)))))