[轉] Lisp語言:Do循環的使用

轉自http://blog.csdn.net/keyboardota/article/details/8240250java

有關Lisp語言中的Do循環,就像不少人說的同樣,初看起來太奇怪了,不知道怎麼理解。因此在這裏作一個簡單的介紹,看完你們能夠發現其實Lisp中的do循環也是比較簡單的。程序員

 

先看看Lisp語言中對於do循環的說明:函數

(do (variable-definitions*)
    (end-test-form result-form*)
     statement*)


翻譯成「中文」大概意思是這樣的:oop

(do (變量定義)
    (結束條件 返回值)
     循環主體)

 

其中的「變量定義」又有一些格式,展開大概是這個樣子的:測試

(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

int x=1;
while (x<=10)
{
      System.out.println("in the loop "+x);
      x=x+1;
}


注意這裏沒有使用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~%"))
相關文章
相關標籤/搜索