Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Near-free function currying in Perl

by stvn (Monsignor)
on Nov 17, 2004 at 16:07 UTC ( #408456=note: print w/replies, xml ) Need Help??


in reply to Near-free function currying in Perl

Very nice meditation, Tom. Being a fan of functional programming myself, I really enjoy reading your meditations. However, being a user of OOP programming too, I despise namespace pollution. I like your idea, but I would like to see it be done without the need for creating new functions in the namespaces. This alone would make me not use this module desipte the fact I can see a number places something like this would be handy.

I suggested above (in response to dragonchild's thought on prototypes) the possibility of using attributes to defined the curry-ability of a function. I think this would be a nicer way to do things (assuming it is possible of course), since it would provide the transparent currying you are after (ala Haskell, Std ML, etc). For me, I would rather have the transparency, in fact I think I would even choose curry(\&func ...) over adding the '_c' to a function as well. Naming conventions are a very sensitive issue for many people and I would think even with having all the suffix and prefix options would still not be enough for some, me in particular ;-)

Again, excellent meditation, I really enjoy these.

-stvn

Replies are listed 'Best First'.
Re^2: Near-free function currying in Perl
by dragonchild (Archbishop) on Nov 17, 2004 at 16:56 UTC
    package AutoCurry; require v5.6.1; use Attribute::Handlers::Prospective; sub UNIVERSAL::curry : ATTR(CODE,RAWDATA) { my ($package, $symbol, $referent, $attr, $data, $phase) = @_; my $num = () = $data =~ /(\$)/g; *{"$package".'::'.*{$symbol}{NAME}} = sub { if (@_ < $num) { my @x = @_; return sub { $referent->(@x, @_ ) }; } $referent->(@_); }; } 1; __END__ ############# demo.pl ############# #!perl use strict; use warnings; use AutoCurry; sub foo : curry($$$) { print "Hello @_\n"; }; foo( 'a', 'b', 'c' ); my $ref = foo('d','e'); $ref->('f'); $ref->('g');

    Obviously, improvements can be made, but I think this does what is desired. There is a slight performance penalty, but it's not bad at all.

    Being right, does not endow the right to be rude; politeness costs nothing.
    Being unknowing, is not the same as being stupid.
    Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
    Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

      LOL, you beat me by only a few minutes, I was just going to posts this.

      Although to be honest, neither of our implementations, nor Tom's do what Haskell and Standard ML do, which is too keep currying until all the functions arguments are satisfied.

      my $curried_foo = foo(1); my $even_more_curried_foo = $curried_foo->(2); print $even_more_curried_foo->(3); # now we execute the function
      And from my (limited) understanding of prototypes, it seems that this may not be possible since seems it is difficult to assign an attribute to a closure.

      -stvn
        Easily fixed.
        package Demo; require v5.6.1; use Attribute::Handlers::Prospective; sub UNIVERSAL::curry : ATTR(CODE,RAWDATA) { my ($package, $symbol, $referent, $attr, $data, $phase) = @_; my $num = () = $data =~ /(\$)/g; my $subname = "$package".'::'.*{$symbol}{NAME}; *$subname = sub { if (@_ < $num) { my @x = @_; return sub { $subname->(@x, @_ ) }; } $referent->(@_); }; } 1; __END__

        Being right, does not endow the right to be rude; politeness costs nothing.
        Being unknowing, is not the same as being stupid.
        Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
        Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://408456]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (6)
As of 2020-11-24 20:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?