Index: doc/theses/rob_schluntz/examples/tuples/assign.c
===================================================================
--- doc/theses/rob_schluntz/examples/tuples/assign.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
+++ doc/theses/rob_schluntz/examples/tuples/assign.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
@@ -0,0 +1,9 @@
+int x, z;
+double y;
+[double, double] f();
+
+int main () {
+  [x, y, z] = [f(), 3];       // multiple assignment
+  // [x, y, z] = 1.5;            // mass assignment
+}
+
Index: doc/theses/rob_schluntz/examples/tuples/cast.c
===================================================================
--- doc/theses/rob_schluntz/examples/tuples/cast.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
+++ doc/theses/rob_schluntz/examples/tuples/cast.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
@@ -0,0 +1,10 @@
+[int, int, int] f();
+[int, [int, int], int] g();
+
+int main() {
+  ([int, double])f();           // (1)
+  ([int, [int], int])g();         // (2)
+  printf("%d %d\n", ([void, [int, int]])g());      // (3) -- should work and doesn't -- tries to construct void object, but should ignore that component in terms of the type of the tuple
+  // ([int, int, int, int])g();    // (4) -- should not work and doesn't
+  // ([int, [int, int, int]])g();  // (5) -- should not work and doesn't
+}
Index: doc/theses/rob_schluntz/examples/tuples/ctor.c
===================================================================
--- doc/theses/rob_schluntz/examples/tuples/ctor.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
+++ doc/theses/rob_schluntz/examples/tuples/ctor.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
@@ -0,0 +1,10 @@
+struct S { int x; double y; };
+[void] ?{}(* [int, double] this, S s) {
+  this->0 = s.x;
+  this->1 = s.y;
+}
+int main() {
+  S s = { 123, 345 };
+  [int, double] x = s;
+  printf("%d %g\n", x);
+}
Index: doc/theses/rob_schluntz/examples/tuples/mrv.c
===================================================================
--- doc/theses/rob_schluntz/examples/tuples/mrv.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
+++ doc/theses/rob_schluntz/examples/tuples/mrv.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
@@ -0,0 +1,2 @@
+[int, int] foo();
+[double, int] bar();
Index: doc/theses/rob_schluntz/examples/tuples/mrv_1.c
===================================================================
--- doc/theses/rob_schluntz/examples/tuples/mrv_1.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
+++ doc/theses/rob_schluntz/examples/tuples/mrv_1.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include <ctype.h>
+struct mf_ret {
+  int freq;
+  char ch;
+};
+
+struct mf_ret most_frequent(const char * str) {
+  char freqs [26] = { 0 };
+  struct mf_ret ret = { 0, 'a' };
+  for (int i = 0; str[i] != '\0'; ++i) {
+    if (isalpha(str[i])) {        // only count letters
+      int ch = tolower(str[i]);   // convert to lower case
+      int idx = ch-'a';
+      if (++freqs[idx] > ret.freq) {  // update on new max
+        ret.freq = freqs[idx];
+        ret.ch = ch;
+      }
+    }
+  }
+  return ret;
+}
+
+void dothing(const char * str) {
+  struct mf_ret ret = most_frequent(str);
+  printf("%s -- %d %c\n", str, ret.freq, ret.ch);
+}
+
+int main() {
+  dothing("hello");
+  dothing("hello, world!");
+  dothing("aaabbbba");
+  dothing("");
+}
Index: doc/theses/rob_schluntz/examples/tuples/mrv_2.c
===================================================================
--- doc/theses/rob_schluntz/examples/tuples/mrv_2.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
+++ doc/theses/rob_schluntz/examples/tuples/mrv_2.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <ctype.h>
+
+int most_frequent(const char * str, char * ret_ch) {
+  char freqs [26] = { 0 };
+  int ret_freq = 0;
+  for (int i = 0; str[i] != '\0'; ++i) {
+    if (isalpha(str[i])) {        // only count letters
+      int ch = tolower(str[i]);   // convert to lower case
+      int idx = ch-'a';
+      if (++freqs[idx] > ret_freq) {  // update on new max
+        ret_freq = freqs[idx];
+        *ret_ch = ch;
+      }
+    }
+  }
+  return ret_freq;
+}
+
+void dothing(const char * str) {
+  char ch;
+  int freq = most_frequent(str, &ch);
+  printf("%s -- %d %c\n", str, freq, ch);
+}
+
+int main() {
+  dothing("hello");
+  dothing("hello, world!");
+  dothing("aaabbbba");
+  dothing("");
+}
Index: doc/theses/rob_schluntz/examples/tuples/mrv_3.c
===================================================================
--- doc/theses/rob_schluntz/examples/tuples/mrv_3.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
+++ doc/theses/rob_schluntz/examples/tuples/mrv_3.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
@@ -0,0 +1,33 @@
+#include <stdio.h>
+#include <ctype.h>
+
+[int, char] most_frequent(const char * str) {
+  char freqs [26] = { 0 };
+  int ret_freq = 0;
+  char ret_ch = 'a';
+  for (int i = 0; str[i] != '\0'; ++i) {
+    if (isalpha(str[i])) {        // only count letters
+      int ch = tolower(str[i]);   // convert to lower case
+      int idx = ch-'a';
+      if (++freqs[idx] > ret_freq) {  // update on new max
+        ret_freq = freqs[idx];
+        ret_ch = ch;
+      }
+    }
+  }
+  return [ret_freq, ret_ch];
+}
+
+void dothing(const char * str) {
+  int freq;
+  char ch;
+  [freq, ch] = most_frequent(str);
+  printf("%s -- %d %c\n", str, ret_freq, ret_ch);
+}
+
+int main() {
+  dothing("hello");
+  dothing("hello, world!");
+  dothing("aaabbbba");
+  dothing("");
+}
Index: doc/theses/rob_schluntz/examples/tuples/named.c
===================================================================
--- doc/theses/rob_schluntz/examples/tuples/named.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
+++ doc/theses/rob_schluntz/examples/tuples/named.c	(revision 728df66bde6df9b1ca4ad068be30ea89605f46a3)
@@ -0,0 +1,6 @@
+typedef [int x, int y] Point2D;
+Point2D p1, p2;
+int main() {
+  p1.x + p1.y + p2.x + p2.y;
+  p1.0 + p1.1 + p2.0 + p2.1;  // equivalent
+}
