X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FAutobox%2FCode.pm;h=c2e33a158e684d43b753d33ede98caf40cb01ef2;hb=be33400260d5c3be940039bf5dd6a3299c0c3801;hp=51014667aa3f34dff5150def9fb46762e6764d91;hpb=5272f13f684d461d95aa45de22d8776a98c03c64;p=gitmo%2FMoose-Autobox.git diff --git a/lib/Moose/Autobox/Code.pm b/lib/Moose/Autobox/Code.pm index 5101466..c2e33a1 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.02'; 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,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 @@ -73,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 @@ -81,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 @@ -100,4 +143,4 @@ 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