X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FAutobox%2FCode.pm;h=a809ccc3d2597245d9673c08451f4f6f263ceae8;hb=bf86825986f42b8447522a62c309e06743cac06a;hp=74ceb2757d5b680d027f5ddeb8819d417c28d2e5;hpb=f6e003cc1ce0661451c5334ecbc044121cda2439;p=gitmo%2FMoose-Autobox.git diff --git a/lib/Moose/Autobox/Code.pm b/lib/Moose/Autobox/Code.pm index 74ceb27..a809ccc 100644 --- a/lib/Moose/Autobox/Code.pm +++ b/lib/Moose/Autobox/Code.pm @@ -1,8 +1,8 @@ package Moose::Autobox::Code; use Moose::Role 'with'; -use autobox; +use Moose::Autobox; -our $VERSION = '0.01'; +our $VERSION = '0.09'; 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