2012-10-16 73 views
3

我有興趣在Common Lisp中實現「單行」計數器/進度條。沒有什麼特別的,只是這樣的:Common Lisp - 單行打印/返回/單行計數器/格式化

=>

==>

===> ...等等。

,然後有它重新開始。或者可以統計我訪問過的節點的數量。

但是,我想在一行上完成所有操作,並清除先前打印的字符。例如,在Python,這將是這樣的:

for i in range(0,1000):  
    print "\r",i," " 

然後將計算,但保持在同一行的一切,同時清除一切任何給定的迭代之前印在該行。

我知道lisp有(format t "text" #\return),但這似乎並不奏效。

有誰知道我該怎麼做? (我環顧四周,似乎無法找到任何東西)。

感謝,

安德魯

編輯:

我找到了解決辦法。您需要爲#\return添加指令(通用「~A」工作)來進行處理:

(loop for i from 0 to 50000 do 
     (format t "~A~A   " #\return i)) 

這將算到50000,你可以看它做到這一點。所以,它可以用於任何其他可能需要重複使用單個輸出線的情況。

+2

@wvxvw:我想他想打印一個回報,而不是換行。 –

+1

@ andrewm921請發佈您的答案,接受它並指定您正在使用的lisp實施和平臺。 – acelent

回答

1
(defun show-progress (len) 
    (format t "=") 
    (dotimes 
     (i len) 
    (format t "=")) 
    (format t ">") 
) 

後執行此功能,您應該看到這樣的輸出:

CL-USER> (show-progress 10) 
===========> 
NIL 
+0

是的,這是可行的,但如果你想讓它繞回(如果你實際上沒有測量進度,但提供了視覺上的分心),那麼效果不好。 – andrewm921

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

如果您想了解更多令人費解的方式。而且,哦,等等,它會創建與原始字符串完全一樣多的字符串......哎呀:)


不幸的是,我不知道格式良好的指令,將清楚地重複一個角色,讓上面的似乎是這樣做的最簡單的方法,但是,也有其他有趣的方式去做高效

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

例如。

+2

這並不是那麼好,因爲你會提起我的字符串。如果你想成爲(太?)聰明的人,那麼你可以使用format指令來打印i字符。 –