New names - 2.068 roundup
John Colvin via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jun 24 03:45:26 PDT 2015
On Wednesday, 24 June 2015 at 01:04:01 UTC, Adam D. Ruppe wrote:
> We disagreed on this on irc, but I ask you to consider the
> following which limits the code breakage a lot more than my
> first proposal in chat:
>
> ---
>
> import std.range;
>
> struct ToLowered(R) if(isInputRange!R) {
> R inputRange;
> this(R r) {
> static if(isForwardRange!R)
> inputRange = r;
> if(!empty)
> front = cast(char) (inputRange.front | 0x20);
> }
>
> char front;
>
> static if(isForwardRange!R)
> typeof(this) save() { return this; }
>
> bool empty() {
> return inputRange.empty();
> }
>
> void popFront() {
> inputRange.popFront();
> if(!empty)
> front = cast(char) (inputRange.front | 0x20);
> }
>
> private immutable(char)[] eagerCache;
> deprecated("please call .array on this yourself or adjust your
> algorithm to use the laziness (tip: changing string
> declarations to auto may help)")
> string eager() pure {
> if(eagerCache is null) {
> foreach(c; this)
> eagerCache ~= c;
> }
> return eagerCache;
> }
>
> alias eager this;
> }
>
> ToLowered!R toLower(R)(R r) {
> return ToLowered!R(r);
> }
>
>
> void main() {
> import std.stdio;
>
> string s = "Amazing Stuff".toLower; // alias this!
> writeln(s);
>
> string[string] lol;
> lol["FOO"] = "FOO".toLower; // alias this!
>
> writeln(lol);
> }
>
> ---
>
>
> The code breakage is minimal (especially if we don't actually
> deprecate that eager method) - cases where a string is expected
> is automatically handled by the alias this, and pipelines using
> auto will just work. Copying this struct has the same semantics
> as copying the string The change of type can break code - but
> only code that was neither quite static nor quite generic.
>
> Code that statically takes a string works, as will returning a
> string, that's also covered by alias this. Code that
> generically works on input/forward ranges works, as this is
> still a by-value forward range. Only code that takes a template
> argument and literally checks if(is(T == string)) or
> if(is(isArray!T)) and those variants will break on this.
>
>
>
> I confess, that is some code, but with alias this, we have a
> migration path to change a lot of usages of the existing
> functions to be lazy without dreaming up new names.
>
> Moreover, with this, some old code will *automatically* be
> upgraded to laziness without needing to change at all too. Tell
> me that doesn't at least tempt you!
Yup, mind completely blown.
I almost want to put "alias eager this;" in all my ranges now...
More information about the Digitalmars-d
mailing list