X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FAutobox%2FCode.pm;h=14c07a3e25f3504338b76b60f916dabe1c37cd43;hb=a1f00ce9bc1114d8573e56079e46db8687a01602;hp=0dabc535627e405f8017908bffee26aabb3ae235;hpb=7dad276528d940b1475e55f8acfdc9414ba1f6bc;p=gitmo%2FMoose-Autobox.git diff --git a/lib/Moose/Autobox/Code.pm b/lib/Moose/Autobox/Code.pm index 0dabc53..14c07a3 100644 --- a/lib/Moose/Autobox/Code.pm +++ b/lib/Moose/Autobox/Code.pm @@ -2,7 +2,7 @@ package Moose::Autobox::Code; use Moose::Role 'with'; use Moose::Autobox; -our $VERSION = '0.02'; +our $VERSION = '0.13'; with 'Moose::Autobox::Ref'; @@ -32,11 +32,17 @@ sub conjoin { return sub { $f->(@_) && $f2->(@_) } } -#sub dump { - #my ($self) = @_; - #require Data::Dump::Streamer; - #return Data::Dump::Streamer::Dump($self)->Out(); -#} +# fixed point combinators + +sub u { + my $f = shift; + sub { $f->($f, @_) }; +} + +sub y { + my $f = shift; + (sub { my $h = shift; sub { $f->(($h->u)->())->(@_) } }->u)->(); +} 1; @@ -51,12 +57,25 @@ Moose::Autobox::Code - the Code role =head1 SYNOPOSIS use Moose::Autobox; - use autobox; my $adder = sub { $_[0] + $_[1] }; my $add_2 = $adder->curry(2); $add_2->(2); # returns 4 + + # create a recursive subroutine + # using the Y combinator + *factorial = sub { + my $f = shift; + sub { + my $n = shift; + return 1 if $n < 2; + return $n * $f->($n - 1); + } + }->y; + + factorial(10) # returns 3628800 + =head1 DESCRIPTION @@ -79,6 +98,14 @@ This is a role to describe operations on the Code type. This will take a list of C<@subs> and compose them all into a single subroutine where the output of one sub will be the input of another. +=item B + +This implements the Y combinator. + +=item B + +This implements the U combinator. + =back =over 4 @@ -87,6 +114,16 @@ subroutine where the output of one sub will be the input of another. =back +=head1 SEE ALSO + +=over 4 + +=item L + +=item L + +=back + =head1 BUGS All complex software has bugs lurking in it, and this module is no @@ -99,7 +136,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006 by Infinity Interactive, Inc. +Copyright 2006-2008 by Infinity Interactive, Inc. L