을 루프의 주된 문제점은 WHEN
-expression입니다.
사용 루프 WHEN condition DO forms
-clause :
(loop for...
when (eq ...) do (return-from ...))
사용 루프 DO
-clause 내부의 일반 WHEN
-macro : 당신이 쓸 수있는 두 가지 방법이 있습니다
(loop for...
do (when (eq ...)
(return-from ...)))
코드에서 수정해야 할 몇 가지 사항이 있습니다. 리스프 사물의 이름을 지정할 때
- 오히려 (
check-zero
보다는 checkZero
) CamelCase를보다 단어 사이에 대시를 사용합니다.
- 일반 숫자 비교에는
=
을 사용하고 숫자가 0인지 확인하려면 ZEROP
을 사용하십시오. EQ
은 두 객체가 같은 객체인지 확인하는 데 사용됩니다.
- 당신은 내가 당신이
(VALUES-LIST (NTH ... (CAR ...)))
으로 달성하기 위해 노력하고 무엇을 아주 확실하지 않다 RETURN
- 사용하여 루프에서 반환 할 수 있지만, 작동하지 않을 것. 단순한 값 목록 (예 :
(1 2 3 4 5 6)
)을 단순히 반복하려는 경우 루프 FOR item IN list
- 절을 사용해야합니다.이 (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
을 사용하여 목록에 0이 포함되어 있는지 확인할 수 있습니다.
(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에서 true로 간주됩니다.객체가 0 인 경우 확인하는 술어 기능 (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 ...)') 그래서'when (eq ...) (return-from ...)'을하고'do'를'(return-from ...)'앞에 넣으십시오. – Renzo
[Practical Common Lisp] (http://www.gigamonkeys.com/book/)에는 [LOOP for Black Belts]라는 루프가 있습니다 (http://www.gigamonkeys.com/book/loop-for-black). -belts.html). [Lisp의 땅] (http://landoflisp.com/)에서 [실용적인 치트 시트] (http://blog.idorobots.org/media/lolreview/3.png) – Sylwester