template <class Name1, ..., class Namen, class F>
struct lambda
  template <class T1, ..., class Tn>
  struct apply
    // unspecified


Name1, ..., Namen are classes, F is a syntax. The lambda metafunction class takes classes, T1, ..., Tn as arguments and produces a new nullary metafunction. It binds T1, ..., Tn to the names Name1, ..., Namen in the body of F using let.

The arguments may be _, in which case the value of the argument is ignored and no substitution happens.

The metafunction classes support currying as well. Applying less arguments to the metafunction class as n produces a new metafunction class taking the missing arguments. F is evaluated only when all arguments are provided.

#include <mpllibs/metamonad/lambda.hpp>

Expression semantics

For any k > 0, n1 ... nk and t1 ... tk classes and f nullary metafunction

lambda<n1, ..., nk, syntax<f>>::apply<t1, ..., tk>::type

is equivalent to

    mpl::pair<n1, t1>,
    // ...
    mpl::pair<nk, tk>

For any 0 < j < k

lambda<n1, ..., nk, syntax<f>>
  ::apply<t1, ..., tj>::type::apply<t(j+1), ..., tk>::type

is equivalent to

lambda<n1, ..., nk, syntax<f>>::apply<t1, ..., tk>::type


using boost::mpl::plus;
using boost::mpl::int_;

using namespace mpllibs::metamonad::name;

typedef lambda<n, syntax<plus<int_<1>, n>>> plus_1;