Returning const? -- A potential solution

Jason House jason.james.house at gmail.com
Sat Mar 7 21:51:53 PST 2009


Daniel Keep wrote:

> 
> 
> Jason House wrote:
>> The ugly const thread got me thinking about the old problem of returning
>> an
>> input while preserving const safety.  I have an idea that seems
>> reasonable...
>> 
>> In a nutshell, I'm thinking that const(T) should be a base type for T,
>> immutable(T) and return(T).
> 
> Wasn't there something like typeof(return) for this?  I do agree that
> something like this needs to be done: I shouldn't have to muck about
> with mixins and/or templates just because I've written a function that
> will work irrespective of const-ness, and thus should work with any
> const-ness on the arguments.
> 
>> return(T) is treated in a read-only fashion,
>> just like const(T) and immutable(T). Here are some of the key things I
>> think this achieves:
>>   * Input arguments are never mutated
> 
>>From whose perspective?  This is one of the weird things about
> const-ness; it's meaning depends on your perspective.  :P
> 
> I assume you meant "Input arguments are never mutated by the callee."

Yes.  The callee never mutates it.



>>   * Use of input parameters in calls to functions as const(T) is 100%
>>   legal.
> 
> Well, one would hope so.  Given that this would mean that arguments
> being T, const(T) or immutable(T) would be valid, this seems to be in
> the same boat as:
> 
> "Features of water: it's got hydrogen in it!"
> 
>>   * Temporary variables can legally be defined and used
> 
> I don't get this.  In what context?  I wasn't aware that using const(T)
> in your code prevented you from having temporary variables...
> 
>>   * Calling other functions that return return(T) is allowed
> 
> I'd bloody well hope so!
> 
>>   * No code duplication
> 
> THIS right here should be the #1 reason.  Having to create multiple
> versions of a function just to correctly propogate const-ness is a right
> PITA.
> 
> Yes, templates, mixins, etc.: I shouldn't HAVE to resort to them.
> 
>>   * No code bloat (compiler only needs to generate one version of the
>>   code)
> 
> Perhaps it would be worth adding this:
> 
> "Compilers may optionally, as a quality of implementation feature,
> generate an overload of the function which specifically handles
> immutable arguments.  This should only be done for optimised builds.
> Any user code which disallows this optimisation may be reported as a
> warning."
> 
> Considering that one of the reasons for having transitive immutability
> is to aid in optimisation, it seems a shame to toss it overboard with a
> pair of lead shoes.

That's an important point that should be addressed after the basic solution 
is found.


>>   * Functions can be virtual
> 
> Well, they can be virtual now: you just have to manually instantiate the
> function 3 times.

I was thinking of the contrast to template-based solutions that avoid code 
duplication, but cause both code bloat and are not virtual.  (Virtual 
template functions is a whole thread in itself that I hope to avoid at the 
moment)


>> Let's take a relatively simple example: max
>> 
>> return(T) max(return(T) a, return(T) b){ return (a>b)?a:b; }
>> 
>> When max is called, the compiler would examine the inputs for a and b to
>> determine what the true type for return(T) is from the callee's
>> perspective...  So a call with T and immutable(T) would use const(T) as
>> the perceived return type while an argument of T and T would use T as the
>> return type.
>> 
>> At the call site, the compiler would ensure type safety of how the return
>> type is used.  Within max, the compiler would ensure that the arguments
>> are either treated as const(T) in function calls but not mixed with with
>> types T, const(T), or immutable(T)
> 
> One would hope the following would work:
> 
> static if( isConst!(typeof(a)) )
> {
>     // Slow, safe way
> }
> else
> {
>     // Exploit mutability
> }

In such scenarios, people are not complaining about code duplication and 
will just code an overloaded function...  I hope that can stay out of this 
thread since it's really a different problem.


>> PS: The return(T) notation is an arbitrary one for the purposes of this
>> post.  We need a technical solution before worrying about the color of
>> the bicycle shed
> 
> It should be red, obviously.  :P
> 
> On a more serious note, the return(T) syntax worries me because it looks
> like there's a template at play here, but I can't see it.  But as you
> say, we should worry about getting Walter to agree this is needed first. 
> :)





More information about the Digitalmars-d mailing list