rendered paste body#define __PICK2nd(a,...) __VA_ARGS__#define DEFINE(Rtype, Name, Env, ...) \ #define NOENV {} \ struct Name##_env Env; \ #undef NOENV \ struct Name##_closure { \ Rtype (*proc) (struct Name##_env* env, \ __VA_ARGS__); \ struct Name##_env env; \ }; \ #define NOENV _,struct Name##_closure Name = { Name##_proc, {} }; \ __PICK2nd(Env) \ #undef NOENV \ Rtype Name##_proc (struct Name##_env* env, __VA_ARGS__) // example usage:#define TCALL(varname,...) varname->proc(&(varname->env), __VA_ARGS__)DEFINE(void, printlis, {char* prefix}, pair_t* lis, int i, pair_t* origlis) { if (! lis) { TCALL(printlis, origlis, i, origlis); } else { printf("%s element %i is value: '%s'\n", env->prefix, i, CAST(char*,lis->car)); TCALL(printlis, lis->cdr, i+1, origlis); }}DEFINE(struct printlis_closure*, make_printlis, NOENV, char* prefix) { LET_NEW(res, struct printlis_closure); res->proc= &printlis; res->env.prefix= prefix; return res;}