#include #include int BZ_LAMBDA_DECL(lambdaAdd, int a) { BZ_LAMBDA_UNPACK_START(); BZ_LAMBDA_UNPACK(int, x); // still have access to x return a + x; } void BZ_LAMBDA_NOP_DECL(printArgs) { BZ_LAMBDA_UNPACK_START(); BZ_LAMBDA_UNPACK(int, argc); BZ_LAMBDA_UNPACK(char **, argv); printf("Program arguments:\n"); for (int i = 0; i < argc; i++) { printf("\t%s\n", argv[i]); } } BzLambda foo(int x) { BzLambda lam = BZ_LAMBDA(lambdaAdd); BZ_LAMBDA_BEGIN_CAPTURE(&lam); BZ_LAMBDA_CAPTURE(&lam, x); // x goes out of scope return lam; } int main(int argc, char **argv) { BzLambda lambda1 = foo(8); printf("%d\n", BZ_LAMBDA_CALL(&lambda1, int, 1)); BzLambda printLam = BZ_LAMBDA(printArgs); BZ_LAMBDA_BEGIN_CAPTURE(&printLam); BZ_LAMBDA_CAPTURE(&printLam, argc); BZ_LAMBDA_CAPTURE(&printLam, argv); BZ_LAMBDA_NOP_CALL(&printLam, void); return 0; }