diff --git a/core.cpp b/core.cpp
index c65fecb..5c632cb 100644
--- a/core.cpp
+++ b/core.cpp
@@ -404,6 +404,42 @@ void print(const char *fmt, ...) {
     va_end(argList);
 }
 
+void print(list<Vector4<real32>> l, StdStream target) {
+    void (*logFn)(const char *fmt, ...) = target == StdStream_stdout ? &printStdout : &printStderr;
+    logFn("{ ");
+    for (size_t i = 0; i < l.length; i++) {
+        if (i != 0) {
+            logFn(", ");
+        }
+        logFn("{ %.2f, %.2f, %.2f, %.2f }", l.data[i].x, l.data[i].y, l.data[i].z, l.data[i].w);
+    }
+    logFn(" } length: %zu, head: %zu\n", l.length, l.head);
+}
+
+void print(list<Vector3<real32>> l, StdStream target) {
+    void (*logFn)(const char *fmt, ...) = target == StdStream_stdout ? &printStdout : &printStderr;
+    logFn("{ ");
+    for (size_t i = 0; i < l.length; i++) {
+        if (i != 0) {
+            logFn(", ");
+        }
+        logFn("{ %.2f, %.2f, %.2f }", l.data[i].x, l.data[i].y, l.data[i].z);
+    }
+    logFn(" } length: %zu, head: %zu\n", l.length, l.head);
+}
+
+void print(list<Vector2<real32>> l, StdStream target) {
+    void (*logFn)(const char *fmt, ...) = target == StdStream_stdout ? &printStdout : &printStderr;
+    logFn("{ ");
+    for (size_t i = 0; i < l.length; i++) {
+        if (i != 0) {
+            logFn(", ");
+        }
+        logFn("{ %.2f, %.2f }", l.data[i].x, l.data[i].y);
+    }
+    logFn(" } length: %zu, head: %zu\n", l.length, l.head);
+}
+
 void print(list<int> l, StdStream target) {
     void (*logFn)(const char *fmt, ...) = target == StdStream_stdout ? &printStdout : &printStderr;
     logFn("{ ");
diff --git a/core.h b/core.h
index 7a89ace..720e1cf 100644
--- a/core.h
+++ b/core.h
@@ -110,6 +110,12 @@ inline function Vector3<T> vec3(T x, T y, T z) {
 
 template <typename T>
 union Vector4 {
+    struct {
+        T r;
+        T g;
+        T b;
+        T a;
+    };
     struct {
         T x;
         T y;
@@ -255,6 +261,9 @@ enum StdStream {
 
 void print(list<int> l, StdStream target = StdStream_stdout);
 void print(list<string> l, StdStream target = StdStream_stdout);
+void print(list<Vector2<real32>> l, StdStream target = StdStream_stdout);
+void print(list<Vector3<real32>> l, StdStream target = StdStream_stdout);
+void print(list<Vector4<real32>> l, StdStream target = StdStream_stdout);
 void print(const char *fmt, ...);
 void printErr(const char *fmt, ...);