いつも使うときに混乱するbind等の定義を試みた
定数
- 1 <= N && N <= 3
- 1 <= M && M <= 9
bind
記法
- _apply(x)を以下のように定義する
- もしxがlambda_functorオブジェクトならば、xそのものを返す
- そうでないならば、_always(x)を返す
- ここで、_always(x)は常にxを返す関数オブジェクトである
有効な式
有効な式 |
意味 |
bind(f, e1,...,eM) |
lambda_functorオブジェクト |
bind(f, e1,...,eM)(a1,...,aN) |
_apply(f)(a1,...,aN)(_apply(e1)(a1,...,aN),...,_apply(eM)(a1,...,aN)) |
placeholder
有効な式
有効な式 |
意味 |
_I |
lambda_functorオブジェクト |
_I(a1,...,aN) |
aI |
protect
有効な式
有効な式 |
意味 |
protect(g) |
lambda_functorオブジェクト |
protect(g)(a1,...,aN) |
g |
前提条件
- gはlambda_functorオブジェクトである
例
#include <pstade/egg/lambda/bind.hpp>
#include <boost/lambda/core.hpp>
#include <boost/lambda/lambda.hpp>
#include <pstade/minimal_test.hpp>
struct T_foo
{
typedef int result_type;
int operator()(int i, int j, int k) const
{
return i + j * k;
}
};
T_foo const foo = {};
void pstade_minimal_test()
{
int ignored = 0;
int _10 = 10;
int _20 = 20;
int _30 = 30;
BOOST_CHECK( bll::_1 (_10) == 10 );
BOOST_CHECK( bll::_1 (_10, ignored) == 10 );
BOOST_CHECK( bll::_1 (_10, ignored, ignored) == 10 );
BOOST_CHECK( bll::protect(bll::_1)(ignored) (_20) == 20 );
BOOST_CHECK( bll::protect(bll::_1)(ignored) (_30, ignored, ignored) == 30 );
egg::T_lambda_bind const bind = egg::lambda_bind;
BOOST_CHECK( 10+20*30 ==
bind(bind, foo, bll::_1, bll::protect(bll::_1), 30) (_10)(_20)
);
BOOST_CHECK( 10+20*30 ==
bind(bind, foo, bll::_1, bll::protect(bll::_1), bll::protect(bll::_2))
(_10)(_20, _30)
);
BOOST_CHECK( 10+20*30 ==
bind(bind, bind, foo, bll::_1, bll::protect(bll::_1), bll::protect(bll::protect(bll::_1)))
(_10)(_20)(_30)
);
}