On Wed, Oct 29, 2003 at 08:32:40PM -0500, Joe Gottman wrote:
>    I just reread the section of A6 about currying, and I have several
> questions about it.

Your questions have caused me to skim over A6 and discover that there
are lots of details I've forgotten.  Hopefully forgetfulness won't be
a problem when we've a perl6 to strengthen those neuronal connections.
:-)

>    1)  Suppose I have a function like the following:
>                sub foo($param, @param) {...}
>         where the parameter names differ only by their sigils.  Is it legal
> for me to type
>         &foo.assuming('$param' => 1)
> in order to disambiguate the parameter names?

Perhaps because I'm feeling a bit pythony today, but why would you do
that?  Two parameters that differ only in sigil can hardly be
descriptive.

>    2)  Often, if you are working with a code reference instead of an actual
> sub, you might not know the names of all the parameters.  In this case,
> would it be legal to curry by parameter position instead of parameter name?
> 
>     sub setFirstToOne(&block) {
>         &block.assuming( 0 => 1); #I am assuming 0-based parameter lists
> }

Hmm.  IIRC assuming returns the function to you.  Since you're not
capturing it anywhere, the above is slightly useless.  It needs to be
something like:

        sub setFirstToOne(&block is rw) {
            &block := &block.assuming( 0 => 1);
        }

Assuming that's what you meant, you can probably just do it with a
wrap (bear with me, I'm muddling through):

        sub setFirstToOne(&block is rw) {
            &block.wrap(sub ([EMAIL PROTECTED]) { call(1,[EMAIL PROTECTED]); });
        }

Now if you didn't want to muck with &block itself, but return a new bit
of code, you can do this:

        sub setFirstToOne(&block is copy) {
            &block.wrap(sub ([EMAIL PROTECTED]) { call(1,[EMAIL PROTECTED]); });
            return █
        }

Where after the call to setFirstToOne(), &block will still have its
original semantics, but the returned subref will have the new
semantics.

> Another advantage of currying by position is that it might allow you to set
> the first few elements of a slurpy array.
> 
>     sub foo(* @params) {...}
>     my $bar = foo.assuming(0 => "hello");
>     $bar.("world"); # Calls foo("hello", "world")

        sub foo ([EMAIL PROTECTED]) { ... }
        my $bar = &foo;
        $bar.wrap(sub ([EMAIL PROTECTED]) { call("hello",[EMAIL PROTECTED]); });
        $bar.("World");

Since wrap() does in-place manipulation, I'm not sure what that means
for &foo after you've wrapped $bar.  Perhaps you need to do the
copying trick like above.

> 3)  Currying binds a function parameter to a value?  Is there any way to
> bind a function parameter to a variable?  Consider the following code:
> 
>     sub printNum(int $x) {print "$x\n";}
>     my $foo = 0;
>     my $vindaloo = &printNum(int).assuming(x => $foo); #currying
>     ++$foo;
>     $vindaloo.();
> 
>    This code prints 0, not 1, because the currying binds the parameter to
> the value $foo had when the currying occurred, not the value it had when the
> curried function was called.  

I'm sure there's some way to do this, but I can't think of it right
off.

-Scott
-- 
Jonathan Scott Duff
[EMAIL PROTECTED]

Reply via email to