new DIP47: Outlining member functions of aggregates
Timon Gehr
timon.gehr at gmx.ch
Sat Sep 7 11:56:46 PDT 2013
On 09/07/2013 07:00 PM, Walter Bright wrote:
> Outlining of member functions is the practice of placing the declaration
> of a member function in the struct/class/union, and placing the
> definition of it at global scope in the module or even in another module.
>
> http://wiki.dlang.org/DIP47
> Rationale:
I don't think that the official rationale should include 'readability',
giving clear preference to one declaration style over the other.
> Semantics:
First of all, the DIP should address the following additional points:
- CTFE (under which circumstances is an outlined member function CTFE-able?)
- UDA's
- DDOC
- Auto return functions
> 1. Only member functions of aggregates at module scope can be outlined.
Why module scope? Why just member functions?
> 2. Types, parameter types, and pure/const/immutable/shared/nothrow attributes must match. This is necessary as they affect overloading and so are needed for correct selection of which declaration is being outlined.
Why would nothrow/pure affect overloading but @safe/static not?
> 3. Parameter names need not match.
OK. (But maybe it is better to require them to match if given in both
places.)
> 4. If there is a default parameter value, it may only appear in the member function declaration.
Probably this is not too bad, but can't you just require the AST to match?
> 5. @safe/@trusted/@system, private/package/public/export access, linkage and storage classes are as set in the declaration, overriding any in effect for the definition.
Isn't the overriding just confusing for no reason?
> 6. Template member functions may not be outlined.
(This is included in point 1.)
> 7. Outlined member function return types, parameter types, and function bodies have private access to the module where the aggregate is declared.
The function names themselves are missing, and maybe you want the
type-declaring module to have access to its private function bodies as
well if it imports the implementing module. In any case, this is rather
ugly. Why not use 'package' for this purpose and keep visibility rather
simple? [1]
([1] Well, IMO 'protected' is quite hard to implement in a
non-restrictive way in presence of compile-time reflection.)
More information about the Digitalmars-d
mailing list