Totally agree

i find the C like interface of glsl to be rather confusing cause its so strict you cannot cast simple types to another "vec2 to float cast or vice versa"
(though newer versions actually started supporting that to some degree) the older versions dont allow it at all so you need the exact type to cast to.
Example
The above is not legal according to the GLSL specification 1.10. With GLSL 1.20, it becomes legal.
float texel = texture2D(tex, texcoord);
The above is wrong since texture2D returns a vec4. Do one of these instead:
float texel = texture2D(tex, texcoord).r;
float texel = texture2D(tex, texcoord).x;
Many more examples also nvidia and ATI glsl versions differ on some types oh hell :S
Productivity is a state of mind.