Boost logo

Boost Users :

Subject: Re: [Boost-users] [phoenix] Basic recursive function.
From: Thomas Heller (thom.heller_at_[hidden])
Date: 2011-04-13 15:04:54


On Wednesday, April 13, 2011 05:10:12 PM Robert Jones wrote:
> I'm a newbie to Phoenix, just exploring, but I guess my intent in this code
> is
> obvious. Can anyone tell me what I'm doing wrong?
>
> Thx
>
> - Rob.
>
> #include <iostream>
> #include <boost/spirit/include/phoenix_core.hpp>
> #include <boost/spirit/home/phoenix/operator.hpp>
> #include <boost/spirit/home/phoenix/statement.hpp>
> #include <boost/function.hpp>
>
> using namespace boost::phoenix;
> using namespace boost::phoenix::arg_names;
> using namespace std;
>
> int main()
> {
> boost::function<unsigned( unsigned )> factorial;
> factorial = if_else( _1 == 0, 1, _1 * factorial( _1 - 1 ) );
>
> cout << factorial( 3 ) << endl;
>
> return 0;
> }

DISCLAIMER: The following is undocumented, might not work and is subject to
change without notice.

Phoenix V3 (from trunk) has experimental support for recursing into itself:
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/scope/this.hpp>
#include <boost/phoenix/statement.hpp>
#include <boost/phoenix/operator.hpp>
#include <boost/phoenix/scope.hpp>

#include <boost/function.hpp>

#include <iostream>

int main()
{
    using boost::phoenix::_this;
    using boost::phoenix::arg_names::_1;

    boost::function<unsigned(unsigned)> factorial
        = if_else(
            _1 <= 1
          , 1
          , _1 * _this(_1 - 1)
        );
    std::cout << factorial( 3 ) << std::endl;
}

Have fun playing with it ;)
I don't accept bugfixes for this feature cause i know it is not working in every
case ... still needs a little work.
If you encounter compile errors, add some dummy phoenix expression at the end of
the recursing branch.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net