Oh geez! I'm sorry, I forgot to mention David Nicol in the REFERENCES,
who also gave great input, especially on the BOOLEAN accessor. Thanks
David! I swear I'll put you in v2. :-{

-Nate

Perl6 RFC Librarian wrote:
> 
> This and other RFCs are available on the web at
>   http://dev.perl.org/rfc/
> 
> =head1 TITLE
> 
> True Polymorphic Objects
> 
> =head1 VERSION
> 
>    Maintainer: Nathan Wiger <[EMAIL PROTECTED]>
>    Date: 25 Aug 2000
>    Mailing List: [EMAIL PROTECTED]
>    Version: 1
>    Number: 159
>    Status: Developing
> 
> =head1 ABSTRACT
> 
> Currently, using objects in numeric and string contexts is not very
> useful or easy:
> 
>    $r = new CGI;
>    $z = $r + $x;      # oops
>    print "$r\n";      # double-oops
> 
> You can use facilities such as C<tie> to help fix this issue, but C<tie>
> is limited and slow. You can also overload operators, but this is not
> flexible enough for many applications since it applies to a package (and
> not individual objects).
> 
> This RFC proposes the concept of B<true polymorphic objects>, which are
> objects that can morph into numbers, strings, booleans, and much more
> on-demand. As such, objects can be freely passed around and manipulated
> without having to care what they contain (or even that they're objects).
> 
> =head1 DESCRIPTION
> 
> =head1 Overview
> 
> The top-level syntax remains the same. As such, transition to Perl 6 is
> very smooth for most people, and in fact most users don't have to care
> about any of the following details. To them, this script will "just
> work":
> 
>    $y = Math->data(7);
>    $x = 3;
>    $name = getname("Nate");
>    if ( $x < 5 ) {
>       $y += $x;
>       if ( ! $name ) {
>          $name = "The math whiz";
>       }
>    }
>    print "$name got $y";   # "Nate got 10"
> 
> However, under the hood things might work drastically differently. In
> fact, C<$y> and C<$name> might well be polymorphic objects:
> 
>    $y = Math->data(7);          # $y->CREATE, $y->STORE(7)
>    $x = 3;                      # $x = 3
>    $name = getname("Nate");     # $name->CREATE, $name->STORE("Nate")
>    if ( $x < 5 ) {              # $x < 5
>       $y += $x;                 # $y->STORE($y->NUMBER->PLUS($x))
>       if ( ! $name ) {          # $name || $name->BOOLEAN
>         $name = "The math whiz";# $name->STORE("...")
>       }
>    }
>    print "$name got $y";        # $name->STRING , $y->STRING
> 
> Here, C<$y> and C<$name> are objects, but we don't have to care. These
> objects have a key property: I<context sensitivity>. They have numerous
> different methods which are each called only in specific instances. So,
> being called in a numeric context calls C<NUMBER>, whereas being called
> in a string context would call C<STRING>.
> 
> Plus, operators are overloadable as well. This means that we might
> decide to overload C<+> to become a Java-like concatenation operator on
> our objects:
> 
>    $string = $name + "Wiger";   # $name->STRING->PLUS("Wiger")
> 
> Yuck. :-) But it can be done, and that's pretty cool.
> 
> =head2 Polymorphic Methods
> 
> The following are the proposed methods for Perl 6 objects.  Note that
> these methods are completely I<optional> for a class to define. If they
> are not defined, the object would retain its current behavior. The hooks
> are in Perl if you want them, otherwise they don't get in the way.
> 
> Note that C<STRING>, C<NUMBER>, and C<BOOLEAN> are specialized forms of
> C<FETCH>. If you define them, they are used instead of C<FETCH> in the
> given context, otherwise C<FETCH> is used. Also note that the operators,
> when overloaded, behave similarly to 'use overload', but on an
> I<object-by-object basis>, rather than package-wide.
> 
>    Data Conversion and Access
>    -------------------------------------------------
>    STRING           Called in a string context
>    NUMBER           Called in a numeric context
>    BOOLEAN          Called in a boolean context
> 
>    Operator Overloading
>    -------------------------------------------------
>    PLUS             Called in + context
>    MINUS            Called in - context
>    TIMES            Called in * context
>    DIVIDED          Called in / context
>    MODULUS          Called in % context
> 
>    NUMCMP           Called in <=> context
>    NUMEQ            Called in == context
>    NUMNE            Called in != context
>    NUMLT            Called in <  context
>    NUMGT            Called in >  context
>    NUMLE            Called in <= context
>    NUMGE            Called in >= context
> 
>    STRCMP           Called in cmp context
>    STREQ            Called in eq context
>    STRNE            Called in ne context
>    STRLT            Called in lt context
>    STRGT            Called in gt context
>    STRLE            Called in le context
>    STRGE            Called in ge context
> 
>    BITAND           Called in & context
>    BITOR            Called in | context
>    BITXOR           Called in ^ context
>    BITNOT           Called in ~ context
> 
>    Assignment and Existence
>    -------------------------------------------------
>    CREATE           Called in object creation
>    STORE            Called in an lvalue = context
>    FETCH            Called in an rvalue = context
>    READLINE         Called in a <> context
>    PRINT            Called in a print context
>    PRINTF           Called in a printf context
>    DESTROY          Called in object destruction
> 
> There are undoubtedly other functions that should be added. However, the
> purpose of this RFC is to propose an idea and a basic interface. [1]
> 
> Others proposed an alternative set of names for these functions, such as
> "OP_*" and "OP_-". However, I strongly disagree with these names. First,
> they're not English words or phrases, so are bad for humans. Second,
> they're not legal \w+ names, which is something we should not circumvent
> with special cases. Third, they're not consistent with already-existing
> Perl functions like C<FETCH> and C<STORE>. Finally, there is actually a
> good amount of ambiguity. For example, does "OP_*" refer to a unary or
> binary * context? With the word "TIMES" there is no such ambiguity.
> 
> Now, whether the word "TIMES" is better than "MULTIPLY" is open for
> debate. I was trying to get the English verb context right:
> 
>    $x * $y     # $x->NUMBER->TIMES($y)
> 
> Which I think makes the function names intuitive and easy to remember. I
> left out any potential _'s because these are a pain to type, and no
> other Perl builtins have them.
> 
> Also, note the C<CREATE> method is actually quite useful. This allows
> you to have multiple methods for creating objects, and C<CREATE> is
> always called first (so you can do your basic blessing in there). This
> is just like a C<BEGIN> for objects. Again, you don't have to use it,
> but the hooks are there.
> 
> =head1 IMPLEMENTATION
> 
> Let's not get ahead of ourselves...yet...
> 
> =head1 MIGRATION
> 
> This introduces new functionality, however p52p6 would have to catch any
> subs defined with the names listed above and warn the user that this sub
> name is now reserved for Perl.
> 
> =head1 NOTES
> 
> [1] Abiding by the KISS property (Keep It Simple, Stupid)
> 
> =head1 REFERENCES
> 
> RFC 49: Objects should have builtin stringifying STRING method
> 
> RFC 73: All Perl core functions should return objects
> 
> Thanks to brian d foy and Damian Conway for their input
> 
> Thanks to Uri Guttman for suggesting CREATE on a different topic

Reply via email to