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=80ecbe1f8423ef47e8ce7717021965455d10e13d;hpb=8937074ab98e81964dee9ccf9bbd939ebf3252a0;p=gitmo%2FMoose-Autobox.git diff --git a/lib/Moose/Autobox/Code.pm b/lib/Moose/Autobox/Code.pm index 80ecbe1..14c07a3 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.13'; with 'Moose::Autobox::Ref'; @@ -32,6 +32,18 @@ sub conjoin { return sub { $f->(@_) && $f2->(@_) } } +# 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; __END__ @@ -45,13 +57,25 @@ Moose::Autobox::Code - the Code role =head1 SYNOPOSIS use Moose::Autobox; - use autobox; my $adder = sub { $_[0] + $_[1] }; - - $add_2 = $adder->curry(2); + 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 @@ -61,17 +85,42 @@ This is a role to describe operations on the Code type. =over 4 +=item B + +=item B + +=item B + +=item B + +=item B + +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 + =item B -=item B +=back -=item B +=head1 SEE ALSO -=item B +=over 4 -=item B +=item L -=item B +=item L =back @@ -87,11 +136,11 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006 by Infinity Interactive, Inc. +Copyright 2006-2008 by Infinity Interactive, Inc. L This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. -=cut \ No newline at end of file +=cut