<brentdax> Is there a Perl 6 tail call syntax, and if so is it
implemented in Pugs?
<autrijus> &sub.goto(...);
<autrijus> and yes.
<brentdax> Oh...are tail method calls possible?
<autrijus> tail method calls. hrmph.

I have a few methods where I'd like to perform tail calls into another
object's methods.  If I were calling one of my own methods, I'd
probably use &meth.goto($?SELF, [EMAIL PROTECTED]) as Autrijus suggested before,
but these are calls into another object, based on its runtime class.

As far as I can tell, the easiest way to do this in Perl 6 is thus:

    $obj.can('meth').goto($obj, [EMAIL PROTECTED]);

Besides the fact that this isn't possible in current Pugs (which seems
to lack a can() method), it has several other problems: it's too long,
the method name is being treated as a string, the object is included
twice, it will fail silently if $obj doesn't have a `meth` method, and
so on.

One suggestion was a tweak of `can`'s definition: instead of returning
a reference to the method, it returns one with the invocant already
curried into it.  Thus, the above becomes this:

    $obj.can('meth').goto([EMAIL PROTECTED]);

While quite a bit better, this still has many of the problems I
mentioned before.  My recommendation is thus:

    $obj.\meth.goto([EMAIL PROTECTED]);

The .\meth takes a precurried reference to the `meth` method (throwing
an appropriate tantrum if `meth` doesn't exist), which can then be
treated like any other subroutine reference, in this case being
invoked as a tail call.

Of course, this adds *another* piece of syntax to an already large
language, so I'm not sure if it's a good idea.

Am I missing something?  How do you think a tail method call should be
performed?

-- 
Brent 'Dax' Royal-Gordon <[EMAIL PROTECTED]>
Perl and Parrot hacker

Reply via email to