On Tue, Jun 10, 2003 at 12:04:14PM -0700, Michael Lazzaro wrote:

> J: (scalar junctive to typed scalar)
> 
>     A scalar junctive, e.g. an "untyped" scalar, can always be silently  
> used as and/or converted to a more specific primitive type.  This will  
> quite frequently result in the loss of information; for example, saying:
> 
>     my     $a = 'foo';
>     my int $b = $a;    # $b is now C<0>
> 
> works, but silently sets $b to 0, because the numeric value of C<'foo'>  
> is C<0 but true>.

On the subject of untyped scalars...what does it mean to say that the
conversion is 'lossless'?  For example:

   my     $a = 'foo';
   my Int $b = $a;      # legal; $b is now 0;  is there a warning?
   my     $c = $b;      # is $c 0, or 'foo'?
   my Str $d = $a;      # no loss
   my     $a = $d;      # no effective change in $a
   my     $e = $b;      # what is $d?

In the above, I would expect that $c is 0 and 

   my     $a = 7 but false;
   my Str $b = $e;      # ???

What value does $f end up with? (My vote would be '7'.)  
Does it have any properties?    
Are any warnings emitted?  


> 
> (iv) ---- Pragma-Controlled Conversions ----
> 
>    Given the above, and given the fact that our general answer to  
> everything is to Use A Pragma ;-), we have the following tentative list  
> of needed pragmas.  For each possibility, we need to be able to declare  
> that a given implicit type conversion will be silently allowed, will  
> result in a warning, or will result in an exception.
> 
> A (very) rough proposed pragma form, for the sake of argument, is:
> 
>     use strict conversions;     # all on  (exceptions)
>     no  strict conversions;     # all off
> 
>     use strict conversions allow => << cv1 cv2 ... >>;  # selected  
> conversions are allowed
>     use strict conversions warn  => << cv1 cv2 ... >>;  # selected  
> conversions give warnings
>     use strict conversions fail  => << cv1 cv2 ... >>;  # selected  
> conversions give exceptions

Seems generally, but I'd like to see this be organized into
hierarchies, like Perl 5 (recent versions) warnings:  the Numeric
group would control every form of numeric conversion, the
Truncation subgroup would control everything in the Numeric group
that could end up truncating data (e.g. int -> short), etc.



> S: (string to numeric)

My vote for default:  C<allow> 


> F: (float to int)

My vote for default:  C<warn> 


> N: (numeric range)

My vote for default:  C<allow> 

I also suggest adding an extra pragma:

    use rangechecking warn => << Int_to_int >>;
    use rangechecking warn => << Num_to_num >>;
    use rangechecking fail => << Int_to_int >>;
    use rangechecking fail => << Num_to_num >>;

This lets you trade speed for safety on a lexically-scoped basis.


> (vi) ---- Conversions of User Defined Types/Classes ----
> 
>    It may be useful to allow the same level of pragma-based control for  
> user-defined types and classes.  For example, a given class Foo may  
> wish to be "silently" convertable to an C<int>.  One proposed syntax to  
> declare the method of coercion/conversion might be:
> 
>      class Foo {
>          ...
> 
>          to int {...}      # or C<as int {...}>?
>      }
> 
> However, users of such a class could adjust the warning level of the  
> given conversion using the alternate syntax given above (v):
> 
>      use strict conversions warn { Foo => int };


Adding to the 'hierarchical pragmas' idea that I mentioned above...how
about a 'to_int' group, which controlled any type (user defined or
system) that was attempted to convert itself to an int?  The
extensions are obvious.


--Dks

Reply via email to