(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)

(FILECREATED "11-Apr-2026 23:02:01" {DSK}<home>ryan>il>TURTLE.LISP;1 9839   

      :CHANGES-TO (CLOS::CLASSES TURT::TURTLE)
                  (VARS TURTLECOMS)
                  (CLOS::GENERIC-FUNCTIONS (CL:SETF TURT::DIRECTION))
                  (CLOS::METHODS (TURT::SETPOS (TURT::TURTLE))
                         (TURT::SETPENSIZE (TURT::TURTLE))
                         (TURT::SETPC (TURT::TURTLE))
                         (TURT::SETY (TURT::TURTLE))
                         (TURT::SETX (TURT::TURTLE))
                         (TURT::SETH (TURT::TURTLE))
                         (TURT::PD (TURT::TURTLE))
                         (TURT::PU (TURT::TURTLE))
                         (TURT::LT (TURT::TURTLE))
                         (TURT::RT (TURT::TURTLE))
                         (TURT::HOME (TURT::TURTLE))
                         ((CL:SETF TURT::DIRECTION)
                          (T TURT::TURTLE))
                         (TURT::BK (TURT::TURTLE))
                         (TURT::FD (TURT::TURTLE)))
                  (FUNCTIONS TURT::TURT-DEMO TURT::CLONE-TURTLE TURT::WRAP-DEGREES 
                         TURT::DEGREES->RADIANS TURT::MAKE-TURTLE TURT::CONSTANTLY))


(PRETTYCOMPRINT TURTLECOMS)

(RPAQQ TURTLECOMS
       ((CLOS::CLASSES TURT::TURTLE)
        (CLOS::GENERIC-FUNCTIONS (CL:SETF TURT::DIRECTION))
        (CLOS::METHODS (TURT::SETPOS (TURT::TURTLE))
               (TURT::SETPENSIZE (TURT::TURTLE))
               (TURT::SETPC (TURT::TURTLE))
               (TURT::SETY (TURT::TURTLE))
               (TURT::SETX (TURT::TURTLE))
               (TURT::SETH (TURT::TURTLE))
               (TURT::PD (TURT::TURTLE))
               (TURT::PU (TURT::TURTLE))
               (TURT::LT (TURT::TURTLE))
               (TURT::RT (TURT::TURTLE))
               (TURT::HOME (TURT::TURTLE))
               ((CL:SETF TURT::DIRECTION)
                (T TURT::TURTLE))
               (TURT::BK (TURT::TURTLE))
               (TURT::FD (TURT::TURTLE)))
        (FUNCTIONS TURT::CLONE-TURTLE TURT::CONSTANTLY TURT::DEGREES->RADIANS TURT::MAKE-TURTLE 
               TURT::TURT-DEMO TURT::WRAP-DEGREES)))

(CLOS:DEFCLASS TURT::TURTLE ()
    ((TURT::%%X :INITARG :X :ACCESSOR TURT::X :INITFORM 0)
     (TURT::%%Y :INITARG :Y :ACCESSOR TURT::Y :INITFORM 0)
     (TURT::%%DIRECTION :INITARG :DIRECTION :ACCESSOR TURT::DIRECTION :INITFORM 0)
     (TURT::%%TAIL-DOWN :INITARG :TAIL-DOWN :ACCESSOR TURT::TAIL-DOWN :INITFORM T)
     (TURT::%%COLOR :INITARG :COLOR :ACCESSOR TURT::COLOR :INITFORM "black")
     (TURT::%%PEN-SIZE :INITARG :PEN-SIZE :ACCESSOR TURT::PEN-SIZE :INITFORM 1)
     (TURT::%%DRAW-FN :INITARG :DRAW-FN :ACCESSOR TURT::DRAW-FN :INITFORM (TURT::CONSTANTLY NIL))))

(CLOS:DEFGENERIC
   (CL:SETF TURT::DIRECTION)
   (TURT::VALUE TURT::OBJECT))

(CLOS:DEFMETHOD TURT::SETPOS ((TURT::TURTLE TURT::TURTLE)
                              TURT::X TURT::Y)
   "Jump to [x, y] (no drawing)."
   (TURT::SETX TURT::TURTLE TURT::X)
   (TURT::SETY TURT::TURTLE TURT::Y))

(CLOS:DEFMETHOD TURT::SETPENSIZE ((TURT::TURTLE TURT::TURTLE)
                                  TURT::VALUE)
   (CL:SETF (TURT::PEN-SIZE TURT::TURTLE)
          TURT::VALUE))

(CLOS:DEFMETHOD TURT::SETPC ((TURT::TURTLE TURT::TURTLE)
                             TURT::VALUE)
   "Set the color to value."
   (CL:SETF (TURT::COLOR TURT::TURTLE)
          TURT::VALUE))

(CLOS:DEFMETHOD TURT::SETY ((TURT::TURTLE TURT::TURTLE)
                            TURT::VALUE)
   "Jump to y (no drawing)."
   (CL:SETF (TURT::Y TURT::TURTLE)
          TURT::VALUE))

(CLOS:DEFMETHOD TURT::SETX ((TURT::TURTLE TURT::TURTLE)
                            TURT::VALUE)
   "Jump to x (no drawing)."
   (CL:SETF (TURT::X TURT::TURTLE)
          TURT::VALUE))

(CLOS:DEFMETHOD TURT::SETH ((TURT::TURTLE TURT::TURTLE)
                            TURT::DEG)
   "Set absolute heading."
   (CL:SETF (TURT::DIRECTION TURT::TURTLE)
          TURT::DEG))

(CLOS:DEFMETHOD TURT::PD ((TURT::TURTLE TURT::TURTLE))
   "State: Lower the pen. Affects future fd and bk commands."
   (CL:SETF (TURT::TAIL-DOWN TURT::TURTLE)
          T))

(CLOS:DEFMETHOD TURT::PU ((TURT::TURTLE TURT::TURTLE))
   "State: Raise the pen. Affects future fd and bk commands."
   (CL:SETF (TURT::TAIL-DOWN TURT::TURTLE)
          NIL))

(CLOS:DEFMETHOD TURT::LT ((TURT::TURTLE TURT::TURTLE)
                          TURT::DEG)
   "Turn left (counter-lockwise)."
   (CL:INCF (TURT::DIRECTION TURT::TURTLE)
          (CL:MOD TURT::DEG 360)))

(CLOS:DEFMETHOD TURT::RT ((TURT::TURTLE TURT::TURTLE)
                          TURT::DEG)
   "Turn right (clockwise)."
   (CL:DECF (TURT::DIRECTION TURT::TURTLE)
          (CL:MOD TURT::DEG 360)))

(CLOS:DEFMETHOD TURT::HOME ((TURT::TURTLE TURT::TURTLE))
   "Move to [0, 0] and face 0 degrees."
   (TURT::SETH TURT::TURTLE 0)
   (TURT::SETPOS TURT::TURTLE 0 0))

(CLOS:DEFMETHOD (CL:SETF TURT::DIRECTION) (TURT::DEGREES (TURT::TURTLE TURT::TURTLE))
   (CL:SETF (CLOS:SLOT-VALUE TURT::TURTLE 'TURT::%%DIRECTION)
          (TURT::WRAP-DEGREES TURT::DEGREES)))

(CLOS:DEFMETHOD TURT::BK ((TURT::TURTLE TURT::TURTLE)
                          CL:STEP)
   "Move backward calling the draw-fn if tail-down. No heading change."
   (TURT::FD TURT::TURTLE (- CL:STEP)))

(CLOS:DEFMETHOD TURT::FD ((TURT::TURTLE TURT::TURTLE)
                          CL:STEP)
   "Move forward calling the draw-fn if tail-down."
   [LET ((TURT::DIRECTION (TURT::DEGREES->RADIANS (TURT::DIRECTION TURT::TURTLE)))
         (TURT::X1 (TURT::X TURT::TURTLE))
         (TURT::Y1 (TURT::Y TURT::TURTLE)))
        (CL:INCF (TURT::X TURT::TURTLE)
               (CL:* (CL:COS TURT::DIRECTION)
                     CL:STEP))
        (CL:INCF (TURT::Y TURT::TURTLE)
               (CL:* (CL:SIN TURT::DIRECTION)
                     CL:STEP))
        (CL:WHEN (TURT::TAIL-DOWN TURT::TURTLE)
            (CL:FUNCALL (TURT::DRAW-FN TURT::TURTLE)
                   TURT::X1 TURT::Y1 (TURT::X TURT::TURTLE)
                   (TURT::Y TURT::TURTLE)
                   (TURT::COLOR TURT::TURTLE)
                   (TURT::PEN-SIZE TURT::TURTLE)))])

(CL:DEFUN TURT::CLONE-TURTLE (TURT::TURTLE)
   "Produce a copy of the turtle. draw-fn shared."
   (CLOS:MAKE-INSTANCE 'TURT::TURTLE :X (TURT::X TURT::TURTLE)
          :Y
          (TURT::Y TURT::TURTLE)
          :DIRECTION
          (TURT::DIRECTION TURT::TURTLE)
          :TAIL-DOWN
          (TURT::TAIL-DOWN TURT::TURTLE)
          :COLOR
          (TURT::COLOR TURT::TURTLE)
          :PEN-SIZE
          (TURT::PEN-SIZE TURT::TURTLE)
          :DRAW-FN
          (TURT::DRAW-FN TURT::TURTLE)))

(CL:DEFUN TURT::CONSTANTLY (TURT::VALUE)
   (CL:LAMBDA (&REST TURT::GARBAGE)
          TURT::VALUE))

(CL:DEFUN TURT::DEGREES->RADIANS (TURT::DEGREES)
   (CL:* TURT::DEGREES (/ CL:PI 180)))

(CL:DEFUN TURT::MAKE-TURTLE (&REST CL:REST)
   (CL:APPLY #'CLOS:MAKE-INSTANCE 'TURT::TURTLE CL:REST))

(CL:DEFUN TURT::TURT-DEMO ()
   (LET* ((TURT::WIDTH 600)
          (TURT::HEIGHT 600)
          (TURT::MID-X (CL:* TURT::WIDTH 0.5))
          (TURT::MID-Y (CL:* TURT::HEIGHT 0.5))
          (TURT::W (DECODE.WINDOW.ARG `(0 0)
                          TURT::WIDTH TURT::HEIGHT "TURTLE DEMO"))
          [TURT::DRAW-FN `(CL:LAMBDA (TURT::X TURT::Y TURT::X2 TURT::Y2 TURT::COLOR TURT::PEN-SIZE)
                                 (DRAWLINE TURT::X TURT::Y TURT::X2 TURT::Y2 TURT::PEN-SIZE NIL
                                        ,TURT::W NIL]
          (TURT::TURT (TURT::MAKE-TURTLE :X (CL:* TURT::MID-X 0.25)
                             :Y
                             (CL:* TURT::MID-Y 1.5)
                             :DRAW-FN TURT::DRAW-FN)))
         (CL:DOTIMES (TURT::H 36)
             (CL:DOTIMES (TURT::I 4)
                 (TURT::FD TURT::TURT 40)
                 (TURT::RT TURT::TURT 90))
             (TURT::RT TURT::TURT 10))
         [LET ((TURT::TURTLES NIL)
               (TURT::TRUNK-LENGTH 96)
               (TURT::REDUCTION-MULTIPLIER 0.75)
               (TURT::LT-ANGLE -45)
               (TURT::RT-ANGLE 45))
              (CL:PUSH (TURT::MAKE-TURTLE :X TURT::MID-X :Y 32 :DIRECTION 90 :DRAW-FN TURT::DRAW-FN 
                              :PEN-SIZE 10)
                     TURT::TURTLES)
              (CL:DOTIMES (TURT::I 10)
                  (CL:LOOP TURT::WITH TURT::TEMP-TURTS = NIL TURT::WITH TURT::T1 TURT::WITH TURT::T2
                         TURT::FOR TURT::TURTLE TURT::IN TURT::TURTLES CL:DO (TURT::FD TURT::TURTLE 
                                                                                   TURT::TRUNK-LENGTH
                                                                                    )
                         (CL:SETF TURT::T1 (TURT::CLONE-TURTLE TURT::TURTLE))
                         (CL:SETF TURT::T2 (TURT::CLONE-TURTLE TURT::TURTLE))
                         (CL:INCF (TURT::DIRECTION TURT::T1)
                                TURT::LT-ANGLE)
                         (CL:INCF (TURT::DIRECTION TURT::T2)
                                TURT::RT-ANGLE)
                         (CL:DECF (TURT::PEN-SIZE TURT::T1))
                         (CL:DECF (TURT::PEN-SIZE TURT::T2))
                         (CL:PUSH TURT::T1 TURT::TEMP-TURTS)
                         (CL:PUSH TURT::T2 TURT::TEMP-TURTS)
                         TURT::FINALLY
                         (CL:SETF TURT::TRUNK-LENGTH (CL:* TURT::TRUNK-LENGTH 
                                                           TURT::REDUCTION-MULTIPLIER))
                         (CL:SETF TURT::TURTLES TURT::TEMP-TURTS)))]
         TURT::W))

(CL:DEFUN TURT::WRAP-DEGREES (TURT::DEGREES)
   (CL:MOD TURT::DEGREES 360))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (6241 6746 (TURT::CLONE-TURTLE 6241 . 6746)) (6748 6852 (TURT::CONSTANTLY 6748 . 6852)) 
(6854 6945 (TURT::DEGREES->RADIANS 6854 . 6945)) (6947 7052 (TURT::MAKE-TURTLE 6947 . 7052)) (7054 
9735 (TURT::TURT-DEMO 7054 . 9735)) (9737 9816 (TURT::WRAP-DEGREES 9737 . 9816)))))
STOP
