Skip to content

Instantly share code, notes, and snippets.

@ramntry
Created April 4, 2014 16:05
Show Gist options
  • Save ramntry/9977755 to your computer and use it in GitHub Desktop.
Save ramntry/9977755 to your computer and use it in GitHub Desktop.
g-function with GC support example
Object merge2_(Object ctr, Object hda_, Object tla_) {
struct {
struct RootsBlock header;
Object gcall_cnd;
Object gcall_merge2;
Object gcall_merge2_1;
Object gcall_lss;
Object ctr_Cons;
Object ctr_Cons_1;
Object ctr_Cons_2;
} m = { { sll_roots, 7 } };
sll_roots = &m.header;
Object result = NULL;
switch (SLL_get_ctr_id(ctr[0])) {
case Cons_: {
m.gcall_lss = lss_(hda_, (Object)ctr[1]);
m.gcall_merge2 = merge2_(tla_, (Object)ctr[1], (Object)ctr[2]);
m.ctr_Cons = create_object_2(Cons_, hda_, m.gcall_merge2);
m.gcall_merge2_1 = merge2_((Object)ctr[2], hda_, tla_);
m.ctr_Cons_1 = create_object_2(Cons_, (Object)ctr[1], m.gcall_merge2_1);
m.gcall_cnd = cnd_(m.gcall_lss, m.ctr_Cons, m.ctr_Cons_1);
result = m.gcall_cnd;
break;
} case Nil_: {
m.ctr_Cons_2 = create_object_2(Cons_, hda_, tla_);
result = m.ctr_Cons_2;
break;
} default:
sll_fatal_error("Inexhaustive pattern matching");
}
sll_roots = m.header.next;
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment