#include #include #include #include #include "fact5.h" void *ktr_empty(void *dismount) { kt* _data = (kt*)malloc(sizeof(kt)); if(!_data) { fprintf(stderr, "Out of memory\n"); exit(1); } _data->tag = _empty_kt; _data->u._empty._dismount = dismount; return (void *)_data; } void *ktr_extend(void *n, void *k) { kt* _data = (kt*)malloc(sizeof(kt)); if(!_data) { fprintf(stderr, "Out of memory\n"); exit(1); } _data->tag = _extend_kt; _data->u._extend._n = n; _data->u._extend._k = k; return (void *)_data; } int main() { n = (void *)(void *)5; pc = &factorialr_cps; mount_tram(); printf("Factorial of 5: %d\n", (int)v);} void factorialr_cps() { if((n == 0)) { kh = (void *)k; v = (void *)(void *)1; pc = &applyr_k; } else { k = (void *)ktr_extend(n,k); n = (void *)(void *)((int)n - (int)(void *)1); pc = &factorialr_cps; } } void applyr_k() { kt* _c = (kt*)kh; switch (_c->tag) { case _empty_kt: { void *dismount = _c->u._empty._dismount; _trstr *trstr = (_trstr *)dismount; longjmp(*trstr->jmpbuf, 1); break; } case _extend_kt: { void *n = _c->u._extend._n; void *k = _c->u._extend._k; kh = (void *)k; v = (void *)(void *)((int)n * (int)v); pc = &applyr_k; break; } } } int mount_tram () { srand (time (NULL)); jmp_buf jb; _trstr trstr; void *dismount; int _status = setjmp(jb); trstr.jmpbuf = &jb; dismount = &trstr; if(!_status) { k= (void *)ktr_empty(dismount); for(;;) { pc(); } } return 0; }