It may be the sloe gin I'm drinking, but this is getting very cool!
Fixed the struct-in-arg bug and that pretty much resolves the main
type-case bugs I was having. I have also reworked the shader args:
Now you have:
* in-args (also known as streams)
* uniforms. Which are after the &uniform flag and before the..
* &context flag which lets you specify the shader-type and
  version.

These changes keep all the args in one place and mean that the
shader definitions can be tiny and familar. Given that the default
context is a vertex shader with version 330:

(defshader :!test! ((position :vec4) (color :vec4))
	 (setf (per-vertex-position per-vertex) position)
	 (out the-color color :smooth))

Results in:

"#version 330

layout(location=0) in vec4 POSITION
layout(location=1) in vec4 COLOR

SMOOTH out vec4 the_color;

void main() {
    gl_PerVertex.gl_Position = POSITION;
    the_color = gl_Color;
}

As you can see, appart from the out qualifier, all is well.
The lisp code is tidy and clean, the types are all inferred from
their definitions and the layouts are automatically calculated.

So yeah, I'm getting there!