All pastes #2102015 Raw Edit

chrissbx

public c v1 · immutable
#2102015 ·published 2012-01-11 01:56 UTC
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;}// desired expansion: (minus the commented line)struct printlis_env {char* prefix};struct printlis_closure { void (*proc) (struct printlis_env* env, pair_t* lis, int i, pair_t* origlis); struct printlis_env env; };// do NOT emit this: struct printlis_closure printlis = { printlis_proc, {} };void printlis_proc (struct printlis_env* env, pair_t* lis, int i, pair_t* origlis) {...}struct make_printlis_env {};struct make_printlis_closure { struct printlis_closure* (*proc) (struct make_printlis_env* env, char* prefix); struct make_printlis_env env; };struct make_printlis_closure make_printlis = { make_printlis_proc, {} };struct printlis_closure* make_printlis_proc (struct make_printlis_env* env, char* prefix) {...}