;;;; Corrected version of parse-where(), originally from AIMA example code,
;;;; in the file agents/environments/grid-env.lisp.
(defun parse-where (env where whats) (cond ((eq where 'EDGE) (let ((x-size (xy-x (grid-environment-size env))) (y-size (xy-y (grid-environment-size env)))) (for i = 0 to (- x-size 1) do (parse-whats env (@ i 0) whats) (parse-whats env (@ i (- y-size 1)) whats)) (for i = 1 to (- y-size 2) do (parse-whats env (@ 0 i) whats) (parse-whats env (@ (- x-size 1) i) whats)))) ((eq where 'ALL) (dotimes (x (xy-x (grid-environment-size env))) (dotimes (y (xy-y (grid-environment-size env))) (when (free-loc? (@ x y) env) (parse-whats env (@ x y) whats))))) ((eq where 'FREE?) (parse-whats env (random-loc env :if 'free-loc?) whats)) ((eq where 'START) (parse-whats env (grid-environment-start env) whats)) ((xy-p where) (parse-whats env where whats)) ((eq (op where) 'AND)(for each w in (args where) do (parse-where env w whats))) (t (warn "Unrecognized object spec ignored: ~A" `(at ,where ,@whats)))))