anchor.diff:  
   #|
   (require :sb-sprof)
  -(defun main/profile (&key (gpu-p t))
  +(defun main/profile (&key (gpu t) (interop nil))
     (sb-sprof:with-profiling (:max-samples 1000
                               :report      :graph
                               :loop        nil)
  -    (main :gpu-p gpu-p)))
  +    (main :gpu gpu :interop interop)))
   |#
   
  -(defun main (&key (gpu-p t))
  +(defun main (&key (gpu t) (interop nil))
     (let ((glut:*run-main-loop-after-display* nil)
           (window (make-instance 'nbody-window)))
       (glut:display-window window) ; GLUT window must be created before initializing nbody-demo
  -    (with-nbody-demo (demo 2048 gpu-p)
  +    (with-nbody-demo (demo 2048 :gpu gpu :interop interop)
         (with-frame-rate-counter (counter)
           (setf (slot-value window 'nbody-demo) demo
                 (slot-value window 'counter)    counter)
           (glut:main-loop)))))
   
  +
   (defun not-implemented ()
     (error "not implemented."))
  
positive.code: 
  (defun memcpy-array-host-to-device (ary)
    (ecase (array-type ary)
      (:gpu (memcpy-host-to-device (raw-array ary)))
      (:cpu (error "invalid array type: cpu"))))
  
  (defun memcpy-array-device-to-host (ary)
    (ecase (array-type ary)
      (:gpu (memcpy-device-to-host (raw-array ary)))
      (:cpu (error "invalid array type: cpu"))))
  
  
  
negative.code:   (gl:end))
  
  (defun draw-points-interop (pos num-bodies)
    (let ((pbo (memory-block-vertex-buffer-object (raw-array pos))))
      ;; enable GL_VERTEX_ARRAY
      (gl:enable-client-state :vertex-array)
      ;; bind a named buffer object
      (gl:bind-buffer :array-buffer pbo)
      ;; define an array of vertex data
      (%gl:vertex-pointer 4 :float 0 (cffi:null-pointer))
      ;; render primitives from array data
      (gl:draw-arrays :points 0 num-bodies)
      ;; unbind a buffer object
      (gl:bind-buffer :array-buffer 0)
      ;; disable GL_VERTEX_ARRAY
      (gl:disable-client-state :vertex-array)))
  
  
  ;;;
  