Phobos begat madness
Walter Bright
newshound2 at digitalmars.com
Fri Jun 22 21:37:07 UTC 2018
In trying to get Phobos to compile with dip1000, I was faced with the following
innocuous looking line:
assert(equal(achr, arr), text(a.byCodepoint));
https://github.com/dlang/phobos/blob/master/std/uni.d#L3763
and the compiler complained that `text(a.byCodepoint)` was a system call. I
decided to accept the Mission Impossible of figuring out why it was inferred as
@system.
I found myself getting lost in a maze of twisty template expansions, all looking
slightly different:
text
begat textImpl
begat to
begat toImpl
begat toStr
begat formatValue
begat formatValueImpl
begat put
begat doPut
begat Appender.put
begat Appender.put
These templates are all just wrappers around wrappers. They're laden with
overloads, constraints and static ifs, so finding just what code is being
compiled with what parameters is absurdly difficult. I can't begin to defend this.
Converting a range of empty/front/popFront to a string should be a simple,
direct piece of code.
For example, simple conversion to a string should not need to detour through a
complex formatting function.
(For those wondering about the genesis of
https://github.com/dlang/dmd/pull/8384, trying to figure this out motivated it.
Saved me lots of time, especially in finding which overload was being called.)
If someone wants to figure out how to build an uncomplicated, straightforward,
efficient implementation of text() that we can be proud of, that would be a nice
contribution.
More information about the Digitalmars-d
mailing list