anchor.diff:  (defun process-in-args (code env)
     "Populate in-args and create fake-structs where they are needed"
     (let ((in-args (v-raw-in-args env)))
  -    (loop :for (name type . arg-details) :in in-args :do
  -       (let* ((declared-glsl-name (when (stringp (lastr arg-details))
  -                                    (lastr arg-details)))
  -              (qualifiers (if declared-glsl-name
  -                              (butlast arg-details)
  -                              arg-details))
  -              (type (if (and (not (type-specp type))
  -                             (vtype-existsp (sym-down type)))
  -                        (sym-down type)
  -                        type))
  -              (type-obj (type-spec->type type :place t))
  -              (glsl-name (or declared-glsl-name (safe-glsl-name-string name))))
  -         (if (typep type-obj 'v-struct)
  -             (add-fake-struct name glsl-name type-obj qualifiers env)
  -             (progn
  -               (add-var name (make-instance 'v-value :type type-obj
  -                                            :glsl-name glsl-name)
  -                        env t)
  -               (setf (v-in-args env)
  -                     (append (v-in-args env)
  -                             `((,name ,(type->type-spec type-obj) ,qualifiers
  -                                      ,glsl-name))))))))
  +    (loop :for in-arg :in in-args :do
  +       (with-in-arg (name type qualifiers declared-glsl-name) in-arg
  +         (let* ((type (if (and (not (type-specp type))
  +                               (vtype-existsp (sym-down type)))
  +                          (sym-down type)
  +                          type))
  +                (type-obj (type-spec->type type :place t))
  +                (glsl-name (or declared-glsl-name (safe-glsl-name-string name))))
  +           (if (typep type-obj 'v-struct)
  +               (add-fake-struct name glsl-name type-obj qualifiers env)
  +               (progn
  +                 (add-var name (make-instance 'v-value :type type-obj
  +                                              :glsl-name glsl-name)
  +                          env t)
  +                 (setf (v-in-args env)
  +                       (append (v-in-args env)
  +                               `((,name ,(type->type-spec type-obj) ,qualifiers
  +                                        ,glsl-name)))))))))
       (values code env)))
   
   ;;----------------------------------------------------------------------
  
positive.code:   (if previous-stage
        (with-stage () stage
          (list (if (args-compatiblep stage previous-stage)
                    (mapcar λ(append (if (stringp (lastr %))
                                         (butlast %) %)
                                     (list (lastr %1)))
                            in-args (out-vars previous-stage))
                    (error 'args-incompatible in-args (out-vars previous-stage)))
                uniforms
                context
                code))
        stage))
  
  (defun compile-stage (accum stage)
    (destructuring-bind (last-stage remaining-stage-types)
  
negative.code:        ;; string at the end. The string is a declaration of what the name of the
         ;; var will be in glsl. This feature is intended for use only by the compiler
         ;; but I see not reason to lock this away.
         (every #'keywordp (in-arg-qualifiers arg)))
      (error "Declaration ~a is badly formed.~%Should be (-var-name- -var-type- &optional qualifiers)" arg))
    t)
  
  