On 07.06.2016 20:45, FreeSlave wrote:
I want to bring up this unpleasant topic for discussion, because I'm
really tired of hacks I need to do in my code.
Look at this snippet:
private bool isFileNothrow(string path)
{
import std.file : isFile;
import std.exception : collectException;
bool ok;
collectException(path.isFile, ok);
return ok;
}
void main(string[] args)
{
import std.algorithm : filter;
auto r = args.filter!(isFileNothrow);
}
Looks good, but it won't compile because isFileNothrow is invisible to
std.algorithm.
Technically it's right: function is private, so no access from other
modules. But it makes me to do hacks like
auto r = args.filter!(p => p.isFileNothrow);
I don't see a way how can I reuse my functions while keeping it private
without ugly hacks.
How about allowing templates from other modules to have access to
private functions? I think this would be pretty legal behavior, since
template is instantiated in this module anyway.
I think it is obvious that this should work. Visibility checks need to
happen during identifier lookup. This lookup is happening in the module
where isFileNothrow is visible.