循環中的主要問題是WHEN
-表達式。還有,你可以寫兩種方式:
使用循環WHEN condition DO forms
-clause:
(loop for...
when (eq ...) do (return-from ...))
使用常規WHEN
-macro循環DO
-clause內:
(loop for...
do (when (eq ...)
(return-from ...)))
還有其他一些事情可以在你的代碼中修復。
- 當Lisp的事物命名,用言語之間劃線,而不是駝峯(
check-zero
而非checkZero
)。
- 使用
=
進行一般數字比較,或使用ZEROP
檢查數字是否爲零。 EQ
用於檢查兩個對象是否是同一個對象。
- 您可以使用
RETURN
- 我不太清楚你想用
(VALUES-LIST (NTH ... (CAR ...)))
成就的進行環回,但它不會去上班。如果您試圖簡單地循環顯示一組值(例如(1 2 3 4 5 6)
),則應該使用循環FOR item IN list
-clause。
所以,現在你應該是這樣的:
(defun check-zero (list)
(loop for item in list
when (zerop item) do (return t)))
LOOP
也有一個THEREIS condition
-clause,您可以使用:
(defun check-zero (list)
(loop for item in list
thereis (zerop item)))
這回只要它找到一個項目時滿足ZEROP
。但是,有更簡單的方法來實現這一點。你可以使用MEMBER
檢查,如果列表包含零:
(defun check-zero (list)
(member 0 list :test #'=))
CL-USER> (check-zero '(1 3 4 3 5 7))
NIL
CL-USER> (check-zero '(1 3 4 3 0 5 7))
(0 5 7)
這將返回一個廣義布爾值。也就是說,任何非NIL
的值在Common Lisp中都被認爲是真的。
既然有一個謂語函數(ZEROP
)檢查的對象是零,你也可以使用SOME
或MEMBER-IF
此:
(some #'zerop '(1 3 4 6 2 0 45 6 7)) ;=> T
(member-if #'zerop '(1 3 4 6 2 0 45 6 7)) ;=> (0 45 6 7)
左右'(當(EQ刪除括號... )(return-from ...))'這樣,當(eq ...)(從...返回)'並且在'(從...返回...)'之前放置一個'do'。 – Renzo
[實用常用Lisp](http://www.gigamonkeys.com/book/)有一個叫做[LOOP for Black Belts]的循環章節(http://www.gigamonkeys.com/book/loop-for-black -belts.html)。在[The land of lisp](http://landoflisp.com/)中,你有一個[實用的備忘單](http://blog.idorobots.org/media/lolreview/3.png) – Sylwester