Index: libcfa/src/vector.hfa
===================================================================
--- libcfa/src/vector.hfa	(revision 8bbdfddcf2464b44a41e3b4122ea0d0a04ab6973)
+++ libcfa/src/vector.hfa	(revision 9a83ccd6ddb602af37aa354436dcee1ac6731ccb)
@@ -1,8 +1,9 @@
 #pragma once
-#include <math.h>
-
+#include "math.hfa"
+#include <iostream.hfa>
 
 //---------------------- Vector Types ----------------------
 // TODO: make generic, as per glm
+
 
 struct vec2 {
@@ -10,9 +11,28 @@
 };
 
-//---------------------- Geometric Functions ----------------------
-// These functions implement the Geometric Functions section of GLSL
+void ?{}( vec2 & v, float x, float y) {
+    v.[x, y] = [x, y];
+}
 
-static inline float dot(const vec2& v, const vec2& u) {
-    return v.x * u.x + v.y * u.y;
+forall( dtype ostype | ostream( ostype ) ) {
+    ostype & ?|?( ostype & os, const vec2& v) with (v) {
+        if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+        fmt( os, "<%g,%g>", x, y);
+        return os;
+    }
+    void ?|?( ostype & os, const vec2 v ) {
+        (ostype &)(os | v); ends( os );
+    }
+}
+
+vec2 ?-?(const vec2& u, const vec2& v) {
+    return [u.x - v.x, u.y - v.y];
+}
+
+/* //---------------------- Geometric Functions ---------------------- */
+/* // These functions implement the Geometric Functions section of GLSL */
+
+static inline float dot(const vec2& u, const vec2& v) {
+    return u.x * v.x + u.y * v.y;
 }
 
Index: main.cfa
===================================================================
--- main.cfa	(revision 8bbdfddcf2464b44a41e3b4122ea0d0a04ab6973)
+++ main.cfa	(revision 9a83ccd6ddb602af37aa354436dcee1ac6731ccb)
@@ -1,10 +1,33 @@
+/* #include <iostream.hfa> */
 #include <fstream.hfa>
-#include <vector.hfa>
+#include "libcfa/src/vector.hfa"
+
+/* [float, float] tuple(const vec2& v) { */
+/*     return [v.x, v.y]; */
+/* } */
+
+
+
+
 
 int main() {
     vec2 v1 = {1,2};
-    sout | length(v1);
-
-    vec2 v2 = {1,2};
-    sout | dot(v1, v2);
+    sout | true;
+    sout | v1;
+    sout | "wot";
+    sout | ((vec2){1,2} - (vec2){3,2});
+    sout | "a" | "b";
+    /* sout | nlOff; */
+    /* sout | sepOff; */
+    /* sout | nlOff; */
+    /* #<{(| sout | nlOff; |)}># */
+    /*  */
+    /* vec2 v1 = {1,2}; */
+    /* sout | "w" | 2.2 | "at" | v1; */
+    /* sout | length(v1); */
+    /*  */
+    /* vec2 v2 = {1,1}; */
+    /* sout | dot(v1, v2); */
+    /*  */
+    /* sout | (v2 - v1) | " " | (v1 - v2); */
 }
