
I don't think it's feasible. You *might* be able to emulate the base interface over a completely separate (and much larger) implementation. However, you won't be able to emulate the extensibility model. For example, one of the defining things about Chaos is its ability to generalize recursion (not referring to the sequence tricks that I started this thread with).
More I'm looking into this, the more its looking feasible to implement in MSVC. Here is a piece of code that implements a FOR macro using a recursion backend, like what is found in Chaos, and all it took was applying some simple workarounds: #include <boost\preprocessor.hpp> #include <boost\preprocessor\detail\is_nullary.hpp> #define PP_EMPTY(...) #define PP_EXPAND(...) __VA_ARGS__ #define PP_WHEN(x) BOOST_PP_IF(x, PP_EXPAND, PP_EMPTY) #define PP_DEFER(m) m PP_EMPTY() #define PP_OBSTRUCT(m) m PP_EMPTY PP_EMPTY()() #define STATE() BOOST_PP_AUTO_REC(IS_VALID, 16) #define NEXT(s) BOOST_PP_INC(s) #define IS_VALID(s) \ BOOST_PP_IS_NULLARY(BOOST_PP_CAT(EVAL_, s)(())) #define EVAL_S(s) BOOST_PP_CAT(EVAL_, s) #define EVAL EVAL_S(STATE()) #define EVAL_1(...) EVAL_RET_1((__VA_ARGS__)) #define EVAL_2(...) EVAL_RET_2((__VA_ARGS__)) #define EVAL_3(...) EVAL_RET_3((__VA_ARGS__)) #define EVAL_4(...) EVAL_RET_4((__VA_ARGS__)) #define EVAL_5(...) EVAL_RET_5((__VA_ARGS__)) #define EVAL_6(...) EVAL_RET_6((__VA_ARGS__)) #define EVAL_7(...) EVAL_RET_7((__VA_ARGS__)) #define EVAL_8(...) EVAL_RET_8((__VA_ARGS__)) #define EVAL_9(...) EVAL_RET_9((__VA_ARGS__)) #define EVAL_10(...) EVAL_RET_10((__VA_ARGS__)) #define EVAL_11(...) EVAL_RET_11((__VA_ARGS__)) #define EVAL_12(...) EVAL_RET_12((__VA_ARGS__)) #define EVAL_13(...) EVAL_RET_13((__VA_ARGS__)) #define EVAL_14(...) EVAL_RET_14((__VA_ARGS__)) #define EVAL_15(...) EVAL_RET_15((__VA_ARGS__)) #define EVAL_16(...) EVAL_RET_16((__VA_ARGS__)) #define EVAL_RET_1(x) EVAL_X_1 x #define EVAL_RET_2(x) EVAL_X_2 x #define EVAL_RET_3(x) EVAL_X_3 x #define EVAL_RET_4(x) EVAL_X_4 x #define EVAL_RET_5(x) EVAL_X_5 x #define EVAL_RET_6(x) EVAL_X_6 x #define EVAL_RET_7(x) EVAL_X_7 x #define EVAL_RET_8(x) EVAL_X_8 x #define EVAL_RET_9(x) EVAL_X_9 x #define EVAL_RET_10(x) EVAL_X_10 x #define EVAL_RET_11(x) EVAL_X_11 x #define EVAL_RET_12(x) EVAL_X_12 x #define EVAL_RET_13(x) EVAL_X_13 x #define EVAL_RET_14(x) EVAL_X_14 x #define EVAL_RET_15(x) EVAL_X_15 x #define EVAL_RET_16(x) EVAL_X_16 x #define EVAL_X_1(...) __VA_ARGS__ #define EVAL_X_2(...) __VA_ARGS__ #define EVAL_X_3(...) __VA_ARGS__ #define EVAL_X_4(...) __VA_ARGS__ #define EVAL_X_5(...) __VA_ARGS__ #define EVAL_X_6(...) __VA_ARGS__ #define EVAL_X_7(...) __VA_ARGS__ #define EVAL_X_8(...) __VA_ARGS__ #define EVAL_X_9(...) __VA_ARGS__ #define EVAL_X_10(...) __VA_ARGS__ #define EVAL_X_11(...) __VA_ARGS__ #define EVAL_X_12(...) __VA_ARGS__ #define EVAL_X_13(...) __VA_ARGS__ #define EVAL_X_14(...) __VA_ARGS__ #define EVAL_X_15(...) __VA_ARGS__ #define EVAL_X_16(...) __VA_ARGS__ #define FOR(pred, op, macro, state) \ FOR_S(STATE(), pred, op, macro, state) \ /**/ #define FOR_S(s, pred, op, macro, state) \ FOR_I( \ PP_OBSTRUCT(), NEXT(s), \ pred, op, macro, state \ ) \ /**/ #define FOR_INDIRECT() FOR_I #define FOR_I(_, s, pred, op, macro, state) \ PP_WHEN _(pred _(s, state))( \ macro _(s, state) \ EVAL_S(s) _(FOR_INDIRECT _()( \ PP_OBSTRUCT _(), NEXT(s), \ pred, op, macro, op _(s, state) \ )) \ ) \ /**/ #define PRED(s, state) BOOST_PP_BOOL(state) #define OP(s, state) BOOST_PP_DEC(state) #define MACRO(s, state) state EVAL(FOR(PRED, OP, MACRO, 10)) // 10 9 8 7 6 5 4 3 2 1