On Sunday, 19 February 2017 at 01:53:58 UTC, Timothee Cour wrote:
Doesn't add indentation:
with (module_!"std.stdio, std.traits")
void fun(T)(File input, T value)
if (isIntegral!T);
* what is the implementation of `module_` ? `from` defined
earlier doesn't allow for multiple modules as in
from!"std.stdio, std.traits"`. But let's assume it can be done
for now.
I don't know how to implement it. Possibly with multiple alias
this.
* when `with` covers multiple declarations, it adds indentation:
with(module_!"std.stdio"){
declaration1;
declaration2;
}
* when `with` covers a single one, it doesn't add indentation,
but then `::` can be used instead, with arguably simpler syntax:
`void fun(T)(std.stdio::File input, T value);`
vs
`with (module_!"std.stdio") void fun(T)(File input, T value);`
What about when the 2nd argument uses File as well? That's the
violation of DRY I meant.
with/module_ solves the UFCS member stand-in problem
elegantly, how does your proposal solve it?:
with (module_!"std.range.primitives")
void func(alias pred, R)(R range)
if (isInputRange!R && is(typeof(pred(range.front)) == bool);
.front has to refer to *either* a member or an imported UFCS
function.
UFCS equally affects the `::` proposal and the
`module_!""`-without-`with` proposal.
Besides the option of not using UFCS, we can actually use Alias
for
this, as I've proposed a while ago in
http://forum.dlang.org/post/[email protected]:
`with (module_!"std.range.primitives") ... pred(range.front)`
vs:
`... pred(range.Alias!(std.range.primitives::front))`
or, if a feature that I've proposed earlier in
http://forum.dlang.org/post/[email protected]
(support UFCS with fully qualified function names) is accepted,
it
becomes even simpler:
`... pred(range.(std.range.primitives::front))`
No, then front only refers to the std.range one, not R.front if
it exists. The with() solution is like a lazy scoped import,
affecting overloading, whereas using just from! or mod:: forces a
lookup in that module scope only.