// The name of the (VALUE, PREVIOUS) record of this type and name. #define dynamic_record(type,name) __ ## type ## _ ## name ## _record // The name of the stack of dynamic bindings for this type and name. Each // stack is a linked list of records. The final record is the global one, // all new records are allocated on the stack by uses of dynamic_bind. #define dynamic_stack(type,name) __ ## type ## _ ## name ## _stack // The name of the cleanup function that is invoked by GCC whenever control // is transferred outside of a dynamic_bind block. #define dynamic_pop(type,name) __ ## type ## _ ## name ## _pop #define defdynamic_aux(type, initform, record, stack, pop) \ struct record { \ type value; \ int validp; \ struct record* previous; \ } record = {initform, 1, 0}; \ struct record* stack = &record; \ void pop(struct record* x) {stack = stack->previous;} \ #define dynamic_bind_aux(initform, record, stack, pop) \ for(struct record __record __attribute__((cleanup (pop))) \ = {initform, 1, stack}; \ stack->validp && (stack = &__record); \ stack->validp = 0) \ #define defdynamic(type, name, initform) \ defdynamic_aux(type, \ initform, \ dynamic_record(type,name), \ dynamic_stack(type,name), \ dynamic_pop(type,name)) \ #define dynamic_bind(type, name, initform) \ dynamic_bind_aux(initform, \ dynamic_record(type, name), \ dynamic_stack(type, name), \ dynamic_pop(type,name)) \ #define dynamic_ref(type, name) \ dynamic_stack(type,name)->value \ ///////////////////////////////// defdynamic(int, x, 5); int bar() { return dynamic_ref(int, x); } int foo() { dynamic_bind(int, x, 42) { return bar(); } } int main(int argc, char** argv) { return foo(); }