anchor.diff:      (2 `(*v ,@vec3s))
       (otherwise whole)))
   
  -(declaim (inline *v)
  -         (ftype (function (vec3 vec3) vec3)
  -                *v))
  -(defun *v (vector-a vector-b)
  -  "Multiplies components, is not dot product, not sure what
  -   i'll need this for yet but hey!"
  -  (declare (vec3 vector-a vector-b))
  +(defn *v ((vector-a vec3) (vector-b vec3)) vec3
  +  "Multiplies components"
  +  (declare (optimize (speed 3) (safety 1) (debug 1)))
     (make (cl:* (aref vector-a 0) (aref vector-b 0))
           (cl:* (aref vector-a 1) (aref vector-b 1))
           (cl:* (aref vector-a 2) (aref vector-b 2))))
   
   ;;---------------------------------------------------------------
   
  -(declaim (inline /s)
  -         (ftype (function (vec3 single-float) vec3)
  -                /s))
  -(defun /s (vector-a a)
  +(defn /s ((vector-a vec3) (a single-float)) vec3
     "divide vector by scalar and return result as new vector"
  -  (declare (vec3 vector-a)
  -           (single-float a))
  +  (declare (optimize (speed 3) (safety 1) (debug 1)))
     (let ((b (cl:/ 1 a)))
       (make (cl:* (aref vector-a 0) b)
             (cl:* (aref vector-a 1) b)
  
positive.code: 
  ;;----------------------------------------------------------------
  
  (declaim (inline lerp)
           (ftype (function (vec3 vec3 single-float) vec3)
                  lerp))
  (defun lerp (vector-a vector-b ammount)
    (declare (vec3 vector-a vector-b))
    (%+ vector-a (*s (%- vector-b vector-a) ammount)))
  
  
  ;; read this for details: (+ (* (- 1.0 v) a) (* v b))
  ;; https://gitlab.common-lisp.net/alexandria/alexandria/commit/926a066611b7b11cb71e26c827a271e500888c30
  ;; thanks to axion for the heads-up
  (declaim (inline stable-lerp)
           (ftype (function (vec3 vec3 single-float) vec3)
                  stable-lerp))
  (defun stable-lerp (vector-a vector-b ammount)
    (declare (vec3 vector-a vector-b))
    (%+ (*s vector-a (cl:- 1s0 ammount))
        (*s vector-b ammount)))
  
  
negative.code: 
  ;;---------------------------------------------------------------
  
  (defn 0p ((vector-a vec3)) boolean
    "Checks if the length of the vector is zero. As this is a
     floating point number it checks to see if the length is
     below a threshold set in the base-maths package"
    (declare (optimize (speed 3) (safety 1) (debug 1)))
    (cl:= 0f0 (cl:+ (expt (aref vector-a 0) 2)
                    (expt (aref vector-a 1) 2)
                    (expt (aref vector-a 2) 2))))
  
  ;;---------------------------------------------------------------
  
  (defn unitp ((vector-a vec3)) boolean
    "Checks if the vector is of unit length. As this is a
     floating point number it checks to see if the length is
     within the range of 1 + or - and threshold set in base-maths"
    (declare (optimize (speed 3) (safety 1) (debug 1)))
    (cl:= 0f0 (cl:- 1.0 (cl:+ (expt (aref vector-a 0) 2)
                              (expt (aref vector-a 1) 2)
                              (expt (aref vector-a 2) 2)))))
  ;;---------------------------------------------------------------
  
  (defn = ((vector-a vec3) (vector-b vec3)) boolean
    "Returns either t if the two vectors are equal.
     Otherwise it returns nil."
    (declare (optimize (speed 3) (safety 1) (debug 1)))
    (and (cl:= (aref vector-a 0) (aref vector-b 0))
         (cl:= (aref vector-a 1) (aref vector-b 1))
         (cl:= (aref vector-a 2) (aref vector-b 2))))
  
  ;;----------------------------------------------------------------
  
  (defn +s ((vec3 vec3) (scalar single-float)) vec3
    (declare (optimize (speed 3) (safety 1) (debug 1)))
    (make (cl:+ (x vec3) scalar)
          (cl:+ (y vec3) scalar)
          (cl:+ (z vec3) scalar)))
  
  ;;----------------------------------------------------------------
  
  (defn -s ((vec3 vec3) (scalar single-float)) vec3
    (declare (optimize (speed 3) (safety 1) (debug 1)))
    (make (cl:- (x vec3) scalar)
          (cl:- (y vec3) scalar)
          (cl:- (z vec3) scalar)))
  
  ;;---------------------------------------------------------------
  
  (defn + (&rest (vec3s vec3)) vec3
    "takes any number of vectors and add them all together
     returning a new vector"
    (declare (optimize (speed 3) (safety 1) (debug 1)))
    (if vec3s
        (let ((x 0f0)
              (y 0f0)
              (z 0f0))
          (declare (single-float x y z))
          (loop :for vec :in vec3s :do
             (incf x (x vec))
             (incf y (y vec))
             (incf z (z vec)))
          (make x y z))
        (make 0s0 0s0 0s0)))
  
  (define-compiler-macro + (&whole whole &rest vec3s)
  