(defun create-universe2 (&optional (cnt 4)) (let ((p1 (make-something 'particle 'p1 4 3 2 5)) (p2 (make-something 'particle 'p2 0 0 0 1)) (p3 (make-something 'particle 'p3 1 1 9 4)) (r1 (make-something 'rocket 'r1 2 3 4 3)) (r2 (make-something 'rocket 'r2 7 5 2 1)) (r3 (make-something 'rocket 'r3 3 4 4 2))) (set-motor r1 '(2 1)) (set-motor r2 '(7 6)) (set-motor r3 '(2 3)) (dotimes (i cnt) (format t "~%~%cnt=~s" i) (dolist (obj (list p1 p2 p3 r1 r2 r3)) (status obj) (cond ((crashed? obj) (format t "~% -> ~a has crashed" (pname obj))) (t (new-position obj) (new-velocity obj)))))))crashしたかどうかの判定は,すべてのパーティクル,ロケットに同じ メソッド crashed? を送ることで行なっています. crashed?のメソッドは,particleに定義されています. 実行結果は以下のようになります.
<cl> (create-universe2) cnt=0 P1's Pos:(4 3) Vel:(2 5) Acc:(0 4) P2's Pos:(0 0) Vel:(0 1) Acc:(0 4) P3's Pos:(1 1) Vel:(9 4) Acc:(0 4) R1's Pos:(2 3) Vel:(4 3) Acc:(2 5) Motor:(2 1) R2's Pos:(7 5) Vel:(2 1) Acc:(7 10) Motor:(7 6) R3's Pos:(3 4) Vel:(4 2) Acc:(2 7) Motor:(2 3) cnt=1 P1's Pos:(6 8) Vel:(2 9) Acc:(0 4) P2's Pos:(0 1) Vel:(0 5) Acc:(0 4) P3's Pos:(10 5) Vel:(9 8) Acc:(0 4) R1's Pos:(6 6) Vel:(6 8) Acc:(2 5) Motor:(2 1) R2's Pos:(9 6) Vel:(9 11) Acc:(7 10) Motor:(7 6) R3's Pos:(7 6) Vel:(6 9) Acc:(2 7) Motor:(2 3) cnt=2 P1's Pos:(8 17) Vel:(2 13) Acc:(0 4) P2's Pos:(0 6) Vel:(0 9) Acc:(0 4) P3's Pos:(19 13) Vel:(9 12) Acc:(0 4) R1's Pos:(12 14) Vel:(8 13) Acc:(2 5) Motor:(2 1) R2's Pos:(18 17) Vel:(16 21) Acc:(7 10) Motor:(7 6) R3's Pos:(13 15) Vel:(8 16) Acc:(2 7) Motor:(2 3) cnt=3 P1's Pos:(10 30) Vel:(2 17) Acc:(0 4) -> P1 has crashed P2's Pos:(0 15) Vel:(0 13) Acc:(0 4) P3's Pos:(28 25) Vel:(9 16) Acc:(0 4) R1's Pos:(20 27) Vel:(10 18) Acc:(2 5) Motor:(2 1) -> R1 has crashed R2's Pos:(34 38) Vel:(23 31) Acc:(7 10) Motor:(7 6) R3's Pos:(21 31) Vel:(10 23) Acc:(2 7) Motor:(2 3) -> R3 has crashed NIL