l; xll_traverse(f,b) [xlseg(f,NULL,NULL,b)] { local x, y, t; x = f; y = NULL; while(x != NULL) [xlseg(f,x,NULL,y) * xlseg(x,NULL,y,b)] { /* do something with x */ t = y; y = x; /* xlseg(f,y,NULL,t) * y|->t xor x' * xlseg(x',NULL,y,b) */ x = y->l; x = t xor x; /* xlseg(f,y,NULL,t) * y|->t xor x * xlseg(x,NULL,y,b) */ } } [xlseg(f,NULL,NULL,b)] xll_esrevart(f,b) [xlseg(f,NULL,NULL,b)] { xll_traverse(b,f); } [xlseg(b,NULL,NULL,f)] xll_esrevart(l) [xlseg(f,NULL,NULL,l)] { local x, y, t; x = l; y = NULL; while(x != NULL) [xlseg(f,y,NULL,x) * xlseg(y,NULL,x,l)] { t = y; y = x; x = y->l; x = t xor x; } } [xlseg(f,NULL,NULL,l)] xll_cons(f,b;) [xlseg(f,NULL,NULL,b)] { local t, u, w; t = new(); t->l = NULL xor f; /* t|->nil xor f * xlseg(f,nil,nil,b) */ if(f != NULL) { /* t|->nil xor f * f|->nil xor z * xlseg(z,nil,f,b) */ u = f->l; w = u xor NULL; f->l = t xor w; /* t|->nil xor f * f|->t xor z * xlseg(z,nil,f,b) */ } else { /* f==nil ; t|->nil xor f * xlseg(f,nil,nil,b) */ b = t; /* f==nil /| b==t ; t|->nil xor f */ /* f==nil /| b==t ; t|->nil xor f * xlseg(f,nil,t,b) */ } /* t|->nil xor f * xlseg(f,nil,t,b) */ f = t; /* f|->nil xor f' * xlseg(f',nil,f,b) */ } [xlseg(f,NULL,NULL,b)] xll_snoc(f,b;) [xlseg(f,NULL,NULL,b)] { local z, t; t = new(); t->l = b xor NULL; /* xlseg(f,nil,nil,b) * t|->b xor nil */ if(f != NULL) { /* b!=nil | xlseg(f,nil,nil,b) * t|->b xor nil */ /* xlseg(f,b,nil,z) * b|->z xor nil * t|->b xor nil */ u = b->l; z = u xor NULL; b->l = t xor z; /* xlseg(f,b,nil,z) * b|->z xor t * t|->b xor nil */ } else { /* f=nil | xlseg(f,nil,nil,b) * t|->b xor nil */ f = t; /* f'=nil /| f=t | t|->b xor nil */ /* f'=nil /| f=t | xlseg(f,t,nil,b) * t|->b xor nil */ } /* xlseg(f,t,nil,b) * t|->b xor nil */ b = t; /* xlseg(f,b,nil,b') * b|->b' xor nil */ } [xlseg(f,NULL,NULL,b)]