
Jonathan Turkanis wrote: [...]
Yes, I'm interested. I'm pretty comfortable implementing the current feature set with above syntax. I'd certainly be interested in you ideas about extensibility, however.
Here's some PP-code that allows a pretty optimal syntax. Works with GCC and probably nothing else, but maybe it's possible to port to other preprocessors. #include <boost/preprocessor/seq.hpp> #include <boost/preprocessor/tuple.hpp> #include <boost/preprocessor/control/while.hpp> #include <boost/preprocessor/detail/is_unary.hpp> #include <boost/preprocessor/arithmetic/add.hpp> #define GET(x) x, ~ #define GET_II(x) GET_III(x) #define GET_III(x, y) x #define MACRO_D(x, y) (BOOST_PP_SEQ_TAIL(x), \ BOOST_PP_SEQ_PUSH_BACK(y, BOOST_PP_SEQ_HEAD(x))) #define MACRO(n, x) MACRO_D(BOOST_PP_TUPLE_ELEM(2, 0, x), \ BOOST_PP_TUPLE_ELEM(2, 1, x)) #define PRED(n, x) BOOST_PP_IS_UNARY(BOOST_PP_TUPLE_ELEM(2, 0, x)) #define INTERFACE_IMPL_II(x) IS_CONST(x none) #define INTERFACE_IMPL(x) [ qualifiers: \ INTERFACE_IMPL_II(BOOST_PP_TUPLE_ELEM(2, 0, x)) ] [ args: \ BOOST_PP_TUPLE_ELEM(2, 1, x) ] #define INTERFACE_II(x) INTERFACE_IMPL(BOOST_PP_WHILE(PRED, MACRO, x)) #define INTERFACE(x) INTERFACE_II((x, BOOST_PP_EMPTY())) #define EAT_CONST_const #define EAT_CONST_volatile #define EAT_CONST_none none #define IS_CONST_II_const 1, ~ #define IS_CONST_II_volatile 2, ~ #define IS_CONST_II_none 0, ~ #define IS_CONST_III(x, y) x #define IS_CONST_II(x) IS_CONST_III(x) #define IS_CONST_DO(x) IS_CONST_II(IS_CONST_II_ ## x) #define IS_CONST_DO_I(x) IS_CONST_DO(x) #define IS_CONST(x) BOOST_PP_ADD(IS_CONST_DO(x), \ IS_CONST_DO_I(EAT_CONST_ ## x)) INTERFACE( (char&)(int) const volatile ) INTERFACE( (char&)(int) const ) INTERFACE( (char&)(int) volatile ) INTERFACE( (char&)(int) ) preprocessing this with gcc results in: [ qualifiers: 3 ] [ args: (char&)(int) ] [ qualifiers: 1 ] [ args: (char&)(int) ] [ qualifiers: 2 ] [ args: (char&)(int) ] [ qualifiers: 0 ] [ args: (char&)(int) ] -- Daniel Wallin