On 3/12/2015 3:55 PM, Eric Niebler wrote:
I'd very much like to add support for recursive lambdas. I can imagine the factorial example looking like this:
using factorial_ = lambda_rec<_a, lazy::if_c<lazy::greater<_a, meta::size_t<0>>, lazy::multiplies<N, lazy::apply<_self, lazy::dec<_a>>> , meta::size_t<1>>>; template<std::size_t N> using factorial = apply<factorial_, meta::size_t<N>>;
Well, that was easy: template<typename ...Ts> struct lambda_rec { template<typename...Us> using apply = meta::apply< let<var<_self, lambda_rec>, lambda<Ts...>>, Us...>; }; using factorial_ = lambda_rec<_a, lazy::if_<lazy::greater<_a, meta::size_t<0>>, lazy::multiplies<_a, lazy::apply<_self, lazy::dec<_a>>>, meta::size_t<1>>>; template<std::size_t N> using factorial = apply<factorial_, meta::size_t<N>>; static_assert(factorial<0>::value == 1, ""); static_assert(factorial<1>::value == 1, ""); static_assert(factorial<2>::value == 2, ""); static_assert(factorial<3>::value == 6, ""); static_assert(factorial<4>::value == 24, ""); Metafunctions? We don't need no stinkin' metafunctions! :-) -- Eric Niebler Boost.org http://www.boost.org