■
Boost.Lambdaでletとかwhereを書かせろ
#define LET(var) [&] { var IN #define IN(body) return body; }() #define LAMBDA(def) [&] { LAMBDA_WHERE(LAMBDA_WHERE_I def) return LAMBDA_BODY def )); }() #define LAMBDA_WHERE(where) LAMBDA_WHERE_II(where PP_NIL) #define LAMBDA_WHERE_I(body) #define LAMBDA_WHERE_II(where) LAMBDA_WHERE_IV(LAMBDA_WHERE_III ## where) #define LAMBDA_WHERE_III(where) NIL where #define LAMBDA_WHERE_IV(where) LAMBDA_WHERE_V(where) #define LAMBDA_WHERE_V(where) LAMBDA_WHERE_VI_ ## where #define LAMBDA_WHERE_VI_LAMBDA_WHERE_III #define LAMBDA_WHERE_VI_NIL #define LAMBDA_BODY(body) body LAMBDA_BODY_I(( #define LAMBDA_BODY_I(par) #define PP_NIL LET (int x = f(1, 2, 3);) (_1 + x) LAMBDA((_1 + x)(int x = f(1, 2, 3);)) LAMBDA((_1 + 1))