Re: Status Summary; next steps

[email protected] (Michael Lazzaro) Mon, 25 Nov 2002 15:06:54 -0800
Newsgroups perl.perl6.documentation
Message-ID <[email protected]>
On Monday, November 25, 2002, at 12:27  PM, Tanton Gibbs wrote:
> Perl 5 did not have typecasts...probably for good reason.  The quip in 
> the camel book says that no one likes to be typecast, anyway.  I would 
> rather not have typecasts in Perl6 if we can get by without them.

Well... Perl5 didn't have typecasts primarily because it didn't have 
types.  To the extent it _does_ have types, it has casting, too: it 
just is extremely limited.

     my $s = scalar <blah>;
     my $s = list <blah>;

The above can be construed as typecasting: converting an expression 
<blah> to either a scalar or list "type", but only if it isn't that 
type already.

So by Perl6 "casting", I mean the transformation of one type to 
another, whether automatic:

     my num $i = 5.0;
     my str $s = $i;   # cast $i to 'str'

or explicit:

     my $i = str 5.0;  # cast the literal number 5.0 to a str


Casting and context are closely related, and both are required (I would 
hope) for multimethods.  If you have a multimethod:

     sub foo (int $var);
     sub foo (str $var);

and you call it like this:

     &foo($myval);

.... the multimethod dispatcher needs to know if $myval is closer to an 
int, or a str, or something that can be easily/trivially cast to an int 
or str.  If I make a subclass of C<str> called C<MyString>, the &foo 
dispatcher should know that a MyString is a str, and call the str-based 
multimethod variant:

    my MyString $mystring = MyString.new('hello');
    &foo($mystring);  # knows to call foo(str), not foo(int)


My hope is that there is little difference between builtin and 
user-defined types/classes, such that both use the same syntax and have 
the same features wrt context and casting:

    my str $s = $var;      # evaluate $var in str context
    my MyClass $s = $var;  # evaluate $var in MyClass context

    my $s = str $var;      # cast $var to str
    my $s = MyClass $var;  # cast $var to MyClass

    my MyClass $myclass = MyClass.new;
    my str $as_string = $myclass;   # cast $myclass to string
    my int $as_int    = $myclass;   # cast $myclass to integer


.... this implies that the want() function can identify context as 
narrowly or as broadly as is needed:

    # class str is scalar;
    # class MyString is str;

    my MyString $s = &foo('bar');  # in C<MyString> context

such that within &foo:

    want scalar;   # TRUE
    want str;      # TRUE
    want MyString; # TRUE
    want hash;     # FALSE

MikeL