NAME

Keyword::TailRecurse - Enables true tail recursion

SYNOPSIS

    use Keyword::TailRecurse;

    sub fibonacci {
        my ( $count, $previous, $current ) = @_;

        return ( $previous // 0 ) if $count <= 0;

        $current //= 1;

        tailRecurse fibonacci ( $count - 1, $current, $previous + $current );
    }

    print fibonacci( 7 );

DESCRIPTION

Keyword::TailRecurse provides a tailRecurse keyword that does proper tail recursion that doesn't grow the call stack.

USAGE

After using the module you can precede a function call with the keyword tailRecurse and rather adding a new entry on the call stack the function call will replace the current entry on the call stack.

ALIASES

By default the keyword tailRecurse is added, but you can use the tail_recurse and/or tailrecurse keywords to add the tail recursion keyword in a form more suitable for different naming conventions.

Sub::Call::Tail compatability

If compatibility with Sub::Call::Tail is required then you can use the subCallTail flag to enable the tail keyword.

    use Keyword::TailRecurse 'subCallTail';

    sub fibonacci {
        my ( $count, $previous, $current ) = @_;

        return ( $previous // 0 ) if $count <= 0;

        $current //= 1;

        tail fibonacci ( $count - 1, $current, $previous + $current );
    }

    print fibonacci( 7 );

Note: with Sub::Call:Tail compatibility enabled both the tailRecurse and tail keywords are available.

REQUIRED PERL VERSION

Keyword::TailRecurse requires features only available in Perl v5.14 and above. In addition a Keyword::TailRecurse dependency doesn't work in Perl v5.20 due to a bug in regular expression compilation.

SEE ALSO

Sub::Call::Recur

An XS module that provides a form of tail recursion - limited to recursing into the same function it's used from.

Sub::Call::Tail

An XS module that provides a generic tail recursion.

LICENSE

Copyright (C) Jason Cooper.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

AUTHOR

Jason Cooper <JLCOOPER@cpan.org>