sub lambda { my $f = $_[1]; for my $x ( $_[0] ) { return sub { local $x = $_[0]; return $f->(); } } } #### sub Y { my ( $curried_rec ) = @_; sub { my ( $f1 ) = @_; $curried_rec->( sub { $f1->( $f1 )->( @_ ) } ) }->( sub { my ( $f2 ) = @_; $curried_rec->( sub { $f2->( $f2 )->( @_ ) } ) } ) } #### print Y( sub { my ( $rec ) = @_; sub { my ( $n ) = @_; $n < 2 ? 1 : $n * $rec->( $n - 1 ); } } )->( 10 );; 3628800