anchor.diff:  (defparameter *vertex-stream* nil)
   (defparameter *loop* 0.0)
   
  -(defsfun sphere ((p :vec3) (r :float))
  -  (return (- (length p) r)))
  +(defmacro-g density-normal (object-call position-arg-num)
  +  (when (not (listp object-call)) (error "object-call form must a list"))
  +  (let ((p (1+ position-arg-num))
  +        (oc object-call))
  +    `(normalize
  +      (v! (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v! 0.01  0.0  0.0)))
  +             ,(utils:replace-nth oc p `(- ,(nth p oc) (v! 0.01  0.0  0.0))))
  +          (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v!  0.0 0.01  0.0)))
  +             ,(utils:replace-nth oc p `(- ,(nth p oc) (v!  0.0 0.01  0.0))))
  +          (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v!  0.0  0.0 0.01)))
  +             ,(utils:replace-nth oc p `(- ,(nth p oc) (v!  0.0  0.0 0.01))))))))
   
  -(defsfun box ((p :vec3) (b :vec3))
  +(defun-g sphere ((p :vec3) (r :float))
  +  (- (length p) r))
  +
  +(defun-g box ((p :vec3) (b :vec3))
     (let ((d (- (abs p) b)))
  -    (return (+ (min (max (x d) (max (y d) (z d))) 0.0)
  -               (length (max d 0.0))))))
  +    (+ (min (max (x d) (max (y d) (z d))) 0.0)
  +       (length (max d 0.0)))))
   
  -(defsfun thing2 ((p :vec3) (r :float) (l :float))
  -  (return (+ (* 0.2 (+ (y p)
  -                       (sin (+ (* (+ (cos l) 8.0)
  -                                  (* 2 (x p))) l))))
  -             (- (length p) r))))
  +(defun-g thing2 ((p :vec3) (r :float) (l :float))
  +  (+ (* 0.2 (+ (y p)
  +               (sin (+ (* (+ (cos l) 8.0)
  +                          (* 2 (x p))) l))))
  +     (- (length p) r)))
   
  -(deffshader frag ((posxy :vec2) &uniform (loop :float) (eye-pos :vec3))
  +(defun-g ray-vert ((position :vec4))
  +  (values position
  +          (swizzle position :xy)))
  +
  +(defun-g ray-frag ((posxy :vec2) &uniform (loop :float) (eye-pos :vec3))
     (let* ((eye-pos (v! 0.0 0.0 -5.0))
            (eye-dir (normalize (v! (x posxy) (y posxy) 1.0)))
            (e eye-pos)
  
positive.code:                                       :dimensions 6))
      (setf *vertex-stream* (make-buffer-stream *gpu-array*))
      (setf running t)
      (loop :while running :do
         (case-events (event) (:quit () (setf running nil)))
         (update-swank)
         (continuable (draw *vertex-stream*))))
    (defun stop-demo () (setf running nil)))
  
  (defun draw (gstream)
    (setf *loop* (+ 0.01 *loop*))
    (gl:clear :color-buffer-bit)
    (gmap #'prog-1 gstream :loop *loop* :eye-pos (v! 0 0 -5))
    (gl:flush)
    (cgl:update-display))
  
  
  (defsmacro density-normal (object-call position-arg-num)
    (when (not (listp object-call)) (error "object-call form must a list"))
    (let ((p (1+ position-arg-num))
          (oc object-call))
      `(normalize
        (v! (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v! 0.01  0.0  0.0)))
               ,(utils:replace-nth oc p `(- ,(nth p oc) (v! 0.01  0.0  0.0))))
            (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v!  0.0 0.01  0.0)))
               ,(utils:replace-nth oc p `(- ,(nth p oc) (v!  0.0 0.01  0.0))))
            (- ,(utils:replace-nth oc p `(+ ,(nth p oc) (v!  0.0  0.0 0.01)))
               ,(utils:replace-nth oc p `(- ,(nth p oc) (v!  0.0  0.0 0.01))))))))
  
negative.code:                  (break)))
             (setf d (max d 0.01))
             (setf e (+ e (* eye-dir d)))))
      (v! output 1.0)))
  
  (defpipeline raymarcher () (g-> #'ray-vert #'ray-frag))
  
  (let ((running nil))
    (defun run-demo ()
  