眠れないので
1 (+ 1 2) (lambda (n) (+ 1 n)) ((lambda (n) (+ 1 n)) 2)
的なλ式をBoostのMPLで書いてみたらどうなるか調べてやってみた。
どこかで聞いたことある「MPLの主な用途は算術計算ではない」というnoticeはneglectな方向で。(ルー的に
#include <boost/mpl/arithmetic.hpp> #include <boost/mpl/lambda.hpp> namespace mpl = boost::mpl; int main() { // 1 mpl::int_<1>::value; // (+ 1 2) mpl::plus<mpl::int_<1>, mpl::int_<2> >::value; // (lambda (n) (+ 1 n)) mpl::lambda<mpl::plus<mpl::int_<1>, mpl::_1> >::type; // ((lambda (n) (+ 1 n) 2) mpl::lambda<mpl::plus<mpl::int_<1>, mpl::_1> >::type::apply<mpl::int_<2> >::type::value; return 0; }
長っ!
...ってか、キモっ!
ちょっと込み入ったλ式だと、すぐ書けんようになる。
いつか書いた
- 継続渡しの階乗計算
- Y Combinatorでの階乗計算
などをMPLで書いてみようとしたけどあっさり挫折。