轉自http://blog.csdn.net/keyboardota/article/details/8240250java
有關Lisp語言中的Do循環,就像不少人說的同樣,初看起來太奇怪了,不知道怎麼理解。因此在這裏作一個簡單的介紹,看完你們能夠發現其實Lisp中的do循環也是比較簡單的。程序員
先看看Lisp語言中對於do循環的說明:函數
翻譯成「中文」大概意思是這樣的:oop
(do (變量定義)
(結束條件 返回值)
循環主體)
其中的「變量定義」又有一些格式,展開大概是這個樣子的:測試
如今咱們但願定義一個變量x,x的初值是1,每次循環x=x+1,當x>10時結束循環,在循環主體中經過format函數輸出變量x,則它的Lisp代碼是這個樣子的: spa
(do ((x 1 (1+ x))) ((> x 10) nil) (format t "in the loop~a ~%" x))
爲了讓各位程序員更好地理解以上Lisp代碼,在這裏列出對應的java代碼:.net
注意這裏沒有使用java裏的do while或者是do until循環,緣由是java裏的do while 和 do until循環都在執行循環主體後才進行判斷,而Lisp中的do循環一開始就進行判斷。翻譯
因此上面使用了java中的while循環,條件也變成了x<=10.code
下面是Lisp中使用do循環的完整代碼,定義了一個測試函數叫do-test,爲了讓輸出更加清晰,在do循環先後分別加了一行輸出。orm
(defun do-test () (format t "staring do loop~%") (do ((x 1 (1+ x))) ((> x 10) nil) (format t "in the loop~a ~%" x)) (format t "end of do loop~%"))