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))

VC8のプリプロセッサで確認。gccで通すには修正が必要