Next: loop-finish Macro, Previous: while-until, Up: End-Test Control [Contents][Index]
always expr never expr thereis expr
takes one form and terminates the loop if the form ever evaluates to nil
;
in this case, it returns nil
. Otherwise, it provides a default return
value of ‘t’.
takes one form and terminates the loop if the form ever evaluates to non-nil;
in this case, it returns nil
. Otherwise, it provides a default return
value of ‘t’.
takes one form and terminates the loop if the form ever evaluates to non-nil; in this case, it returns that value.
Since ‘always’, ‘never’, and ‘thereis’ use the Common Lisp macro return
to
terminate iteration, any ‘finally’ clause that is specified is not evaluated.
;;; Make sure I is always less than 11 (two ways). ;;; The FOR construct terminates these loops. (loop for i from 0 to 10 always (< i 11))
(loop for i from 0 to 10 never (> i 11))
;;; If I exceeds 10, return I; otherwise, return NIL. ;;; The THEREIS construct terminates this loop. (loop for i from 0 thereis (when (> i 10) i) )
;;; The FINALLY clause is not evaluated in these examples. (loop for i from 0 to 10 always (< i 9) finally (print "you won't see this"))
(loop never t finally (print "you won't see this"))
(loop thereis "Here is my value" finally (print "you won't see this"))
;;; The FOR construct terminates this loop, ;;; so the FINALLY clause is evaluated. (loop for i from 1 to 10 thereis (> i 11) finally (print i)) ;Prints 1 line
(defstruct mountain height difficulty (why "because it is there")) (setq everest (make-mountain :height '(2.86e-13 parsecs))) (setq chocorua (make-mountain :height '(1059180001 microns))) (defstruct desert area (humidity 0)) (setq sahara (make-desert :area '(212480000 square furlongs))) ;First there is a mountain, then there is no mountain, then there is ... (loop for x in (list everest sahara chocorua) ; -GLS thereis (and (mountain-p x) (mountain-height x)))
;;; If you could use this code to find a counterexample to ;;; Fermat's last theorem, it would still not return the value ;;; of the counterexample because all of the THEREIS clauses ;;; in this example return only T. Of course, this code has ;;; never been observed to terminate. (loop for z upfrom 2 thereis (loop for n upfrom 3 below (log z 2) thereis (loop for x below z thereis (loop for y below z thereis (= (+ (expt x n) (expt y n)) (expt z n))))))
Next: loop-finish Macro, Previous: while-until, Up: End-Test Control [Contents][Index]