From page 319, 'makecoroutine' define resume = 0 - define makecoroutine = proc (body) let lcs = 0 in letrecproc newcoroutine (value) = lcs(value); localresume (cont, value) = let receivedvalue = letcont localcont in begin lcs := localcont; cont (value) end in begin resume := localresume; receivedvalue end in letcont exit in begin body(localresume (exit, newcoroutine)); error() end =========================================================================== from page 316, coroutine example - define example = proc () letcont returncont in let co1 = 0; co2 = 0 in begin co1 := makecoroutine ( proc (initval1) begin print(1); print(initval1); initval1 := resume (co2, add1 (initval1)); print (1); print (initval1); initval1 := resume (co2, add1 (initval1)); returncont (initval1) end ); co2 := makecoroutine ( proc (initval2) begin print (2); print (initval2); initval2 := resume (co1, add1 (initval2)); print (2); print (initval2); resume (co1, add1 (initval2)) end ); co1(33) end =========================================================================== page 313, breakpoints --> define toplevel = 0 --> letcont cont in toplevel := cont --> define resume = 0 --> define break = proc (x) letcont cont in begin resume := cont; error(); toplevel (x) end --> +(break(1),break(2)) --> resume(100 --> +(break(1), break(2)) =========================================================================== guaranteed to bring your machine down. define tak = 0 tak := proc (x,y,z) if lesser(y,x) then tak(tak(sub1(x),y,z),tak(sub1(y),z,x),tak(sub1(z),x,y)) else z