# Boost Users :

Subject: Re: [Boost-users] [phoenix] Basic recursive function.
From: Thomas Heller (thom.heller_at_[hidden])
Date: 2011-04-14 03:35:19

On Wed, Apr 13, 2011 at 5:35 PM, Dave Abrahams <dave_at_[hidden]> wrote:
> At Wed, 13 Apr 2011 16:10:12 +0100,
> 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 ) );
>
> I think you'd better find a way to store factorial by reference in the
> phoenix expression, because the value at the time of building is
> empty. Â Totally guessing:
>
>
> Â  Â  Â  Â factorial = if_else( _1 == 0, 1, _1 * ref(factorial)( _1 - 1 ) );
Close, but, unfortunately doesn't work like this, factorial will be
evaluated eagerly this way.

The solution is:

factorial = if_else( _1 == 0, 1, _1 * bind(ref(factorial), _1 - 1));

factorial needs to be bound again ... bind and ref is from boost::phoenix.
This only works with V3, and not with V2. You need to use the latest
trunk, or wait for 1.47.