hi, looks good as far as I can tell. W.r.t. the selection part, the "don't care" type is missing, which is "_" IIRC.
So, .sub foo :multi(Integer,_,_) .param pmc i :invocant .param pmc j .param pmc k .end (must j and k be flagged as :invocant?) then this foo can be invoked with 2 parameters, which can be any type, iiuc. The "_" don't-care type is not specified. I think that should be added. While I'm at it, "_" is a valid PIR identifier. So, it's a special case, resulting in special-case code (eeeuhw) There is actually a check in imcc iirc that checks for that id. (it's probably not a good idea to define a class called "_", but that's besides the point). Would it be more clear if there's a special marker, for instance "*" (as this is a well-known wildcard character)? kjs On Dec 20, 2007 9:53 AM, <[EMAIL PROTECTED]> wrote: > Author: allison > Date: Thu Dec 20 00:53:11 2007 > New Revision: 24108 > > Added: > trunk/docs/pdds/pdd27_multiple_dispatch.pod > > Changes in other areas also in this revision: > Modified: > trunk/MANIFEST > > Log: > [pdd] Launch the Multiple Dispatch PDD. > > > Added: trunk/docs/pdds/pdd27_multiple_dispatch.pod > > ============================================================================== > --- (empty file) > +++ trunk/docs/pdds/pdd27_multiple_dispatch.pod Thu Dec 20 00:53:11 2007 > @@ -0,0 +1,215 @@ > +# Copyright (C) 2007, The Perl Foundation. > +# $Id: pdd00_pdd.pod 18781 2007-06-03 14:38:04Z paultcochrane $ > + > +=head1 NAME > + > +docs/pdds/pdd27_multiple_dispatch.pod - Multiple Dispatch > + > +=head1 ABSTRACT > + > +This PDD defines Parrot's multiple dispatch system. > + > +=head1 VERSION > + > +$Revision: 18781 $ > + > +=head1 DEFINITIONS > + > +Multiple dispatch allows a single function name to be associated with > several > +alternate implementations. It selects the alternate to execute for a > +particular call at runtime, based on the types of the arguments passed > into > +the call. The selection process compares the arguments of the call and > the > +types declared in the signatures of the alternates, as well as their > inherited > +or composed parents, to find the best match. > + > +A similar selection of alternates based on types at compile time is > generally > +called overloading. > + > +=head1 DESCRIPTION > + > +=over 4 > + > +=item - Parrot supports multiple dispatch in opcodes and user-defined > routines > + > +=item - A single dispatch system supports MMD in both contexts > + > +=item - For user-defined subroutines and methods, the dispatch system is > +pluggable, allowing users to swap in their own type-matching algorithms > + > +=item - For opcodes, the dispatch system is merely extensible, allowing > users > +to define alternates with their own types > + > +=item Dispatch considers both low-level (register) types and high-level > (PMC) > +types, as well as inherited and composed types > + > +=back > + > +=head1 IMPLEMENTATION > + > +The aim of Parrot's multiple dispatch system is not to be an exact match > to > +any one HLL, but to provide the features and tools needed to support > multiple > +dispatch in a number of different HLLs. > + > +Parrot has a single multiple dispatch system, used at the HLL level and > +internally. {{NOTE: I appreciate the history that led us to have two > largely > +independent MMD systems, but it will cause problems down the road, if we > don't > +fix it now.}} > + > +The heart of the system is the MultiSub PMC. All multiple dispatch > routines > +are MultiSub PMCs, subclasses of MultiSub, or polymorphic equivalents of > +MultiSub. Calls to multiple dispatch routines use the Parrot calling > +conventions. > + > +=head2 MultiSub PMC API > + > +A MultiSub stores a list of subroutines. When a MultiSub is invoked, it > calls > +an MMD sorting routine to select the best candidate for the current > arguments, > +and invokes that candidate. > + > +A MultiSub can be used anywhere a Sub can be used. It can be stored in a > +namespace or as a method or vtable override in a class. > + > +An alternate multiple dispatch matching algorithm may be plugged in by > +subclassing MultiSub and overriding C<invoke>. > + > +=head3 Vtable Functions > + > +MultiSub defines the following vtable functions in addition to the ones > +inherited from ResizablePMCArray. > + > +=over 4 > + > +=item push_pmc > + > +Add a Sub or NCI sub to the list of candidates. Throw an exception if the > +value passed in is anything other than a Sub or NCI sub. > + > +=item set_pmc_keyed_int > + > +Add a Sub or NCI sub to the list of candidates at a particular position > in the > +list. Throw an exception if the value passed in is anything other than a > Sub > +or NCI sub. > + > +=item invoke > + > +Invoke the best matching candidate for the current call arguments. This > vtable > +function calls C<Parrot_mmd_sort_candidate_list> from the public MMD API, > but > +may be changed to call C<Parrot_mmd_invoke>. > + > +=item set_integer_keyed_int, set_number_keyed_int, set_string_keyed_int > + > +Throw an exception, as an integer, float, or string value is not a Sub or > NCI > +sub. (Masks the vtable functions inherited from ResizablePMCArray.) > + > +=back > + > +=head3 PIR subroutine attributes > + > +The following attributes are used when declaring a MultiSub in PIR. > + > +=over 4 > + > +=item :multi > + > + .sub mymultisub :multi(Integer, Integer) > + > +The C<:multi> attribute marks a subroutine or method as participating in > +multiple dispatch. > + > +=item :invocant > + > + .param pmc first :invocant > + > +Not all elements of a multi-sub's signature are relevant for the purposes > of > +multiple dispatch. The subroutine parameters that participate in dispatch > are > +marked with the attribute C<:invocant>. Subs that are not marked with > +C<:multi> may not mark parameters with C<:invocant>. > + > +{{NOTE: I'm open to other names for the attribute. An English form of the > +Latin I<invocare>, "to call upon", is pretty appropriate to the act of > using > +an argument as a selector for multiple dispatch.}} > + > +=back > + > +=head2 C Multiple Dispatch API > + > +These functions are the public interface to common multiple dispatch > +operations, and may be called from opcodes, vtable functions, or other C > +functions. > + > +=over 4 > + > +=item Parrot_mmd_sort_candidate_list > + > +Performs a multiple dispatch lookup on an array of subroutines. The call > +signature to match is pulled from the current interpreter, following the > +Parrot calling conventions. Returns a sorted array of candidates that > match > +the call signature, with the best matching candidate as the 0th element. > + > +=item Parrot_mmd_invoke > + > +Make a multiple dispatch call. Similar in syntax to C<Parrot_PCCINVOKE>, > but > +doesn't separate out the invocant before the signature since the call can > have > +multiple invocants. A significant part of the code from > C<Parrot_PCCINVOKE> > +can be factored out to helper routines used by both C<Parrot_PCCINVOKE> > and > +C<Parrot_mmd_invoke>. > + > + void > + Parrot_mmd_invoke(PARROT_INTERP, NOTNULL(STRING *sub_name), > + ARGIN(const char *signature), ...)> > + > +=item mmd_dispatch* [deprecated] > + > +Dispatch a routine with a fixed low-level (register) type signature, with > +multiple dispatch on the high-level (PMC) types. The low-level call and > return > +types are specified in the name of the function: 'i' for integer, 'n' for > +float, 's' for string, 'p' for PMC, and 'v' for void. So, a dispatch of > one > +PMC and one integer argument that returns void is a call to > +C<mmd_dispatch_v_pi()>. > + > +=back > + > +=head2 Opcode Multiple Dispatch > + > +Parrot's basic opcodes are not multiple dispatch. They appear to be so, > since > +a single opcode name may have multiple signatures. But, behind the > scenes, > +this is essentially compile-time overloading. (Each different signature > is > +actually a different opcode number, hidden behind the abstraction of a > single > +name.) > + > +Multiple dispatch is only used by a limited set of opcodes. These opcodes > +directly correspond to standard vtable functions. Multiple dispatch > opcodes > +may take PMC, integer, float, or string arguments and return a PMC, > integer, > +float, or string result. > + > +Multiple dispatch opcodes are standard opcodes that internally call the > +C<Parrot_mmd_invoke> routine from the public MMD API. > + > +{{NOTE: It is no longer necessary to name multisubs used for opcode > dispatch > +using the "__" names.}} > + > +=head2 Vtable Multiple Dispatch > + > +Some PMCs call multiple dispatch routines from their vtable functions. > +ResizablePMCArray, for example, calls the multiple dispatch equality > operation > +on each element of two arrays from the 'is_equal' vtable function. > + > +Multiple dispatch calls from within vtable functions call the > +C<Parrot_mmd_invoke> routine from the public MMD API. > + > +=head1 ATTACHMENTS > + > +None. > + > +=head1 REFERENCES > + > +docs/mmd.pod > +src/mmd.c > +src/pmc/multisub.pmc > + > +=cut > + > +__END__ > +Local Variables: > + fill-column:78 > +End: >