     }
     return sum
 }
+
+infix operator + { associativity left precedence 140 }
+func +<T:Nat>( left: Vec<T>, right: Vec<T> ) -> Vec<T> {
+    var values = [Float]( count: T.literal(), repeatedValue: 0.0 )
+    for n in 0...T.literal() - 1 {
+        values[n] = left.v[n] + right.v[n]
+    }
+    return Vec<T>( v: values )
+}
+
+func +<T: SpecializedVector>( left: T, right: T ) -> T {
+    var values = [Float]( count: left.count, repeatedValue: 0.0 )
+    for n in 0...left.count - 1 {
+        values[n] = left.v[n] + right.v[n]
+    }
+    return T( v: values )
+}

        get      { return v[1] }
        set( y ) { v[1] = y    }
    }
}

struct Vec3: Vector {
    var v = [Float]( count: 3, repeatedValue: 0.0 )
    var x: Float {
        get      { return v[0] }

        get      { return v[2] }
        set( z ) { v[2] = z    }
    }
    init( v: [Float] ) {
        self.v = Array(v[0...2])
    }
}


struct Vec4: Vector {
    var count = 4
    var v = [Float]( count: 4, repeatedValue: 0.0 )
    var x: Float {
        get      { return v[0] }
