#include struct foo { int a; }; static void my_finalizer(C_word argc, C_word closure, C_word continuation, C_word s) { struct foo *f = (struct foo *) C_pointer_address(s); printf("finalizer %i\n", f->a); free(f); C_kontinue(continuation, C_SCHEME_UNDEFINED); } static C_word finalizer_obj[2] = {(C_word) (C_CLOSURE_TYPE|1), (C_word) my_finalizer}; static void create_foo(C_word argc, C_word closure, C_word continuation, C_word i) { struct foo *f; C_word *space; C_word res; if (argc != 3) C_bad_argc(argc,3); f = malloc(sizeof(struct foo)); f->a = C_unfix(i); space = C_alloc(C_SIZEOF_POINTER); res = C_mpointer(&space, (void *)f); C_do_register_finalizer(res, (C_word) finalizer_obj); C_kontinue(continuation, res); } void registerfunc(C_word argc, C_word closure, C_word continuation) { C_word sym; C_word tmp; C_word *a = C_alloc(2 + C_SIZEOF_INTERNED_SYMBOL(10)); sym = C_intern (&a, 10, "create-foo"); C_mutate ((C_word*)sym+1, (*a=C_CLOSURE_TYPE|1, a[1]=(C_word)create_foo, tmp=(C_word)a, a+=2, tmp)); C_kontinue(continuation, C_SCHEME_TRUE); }