On 13/09/2018 11:54 PM, Jonathan Marler wrote:
"Selective imports" limit the symbols imported from a module by providing a list of all the symbols to include:

import std.stdio : writeln, writefln;

The complement of this would be a "Filtered import", meaning, import all the symbols except the ones in the provided list. I imagine the syntax would look something like:

import std.stdio ~ writeln, writefln;


To provide a use case for this, say you have a module that uses a fair amount of symbols from `std.file` but you want to make sure that all calls to `chdir` are logged.  Using a filtered import would allow you to exclude `chdir` from being available globally so you could create a wrapper that all code is forced to go through.

import std.stdio;
import std.file ~ chdir;

void chdir(R)(R path)
{
     writefln("chdir '%s'", path);
     from!"std.file".chdir(path);
}

It's an interesting variation on D's current repertoire of import semantics. Possibly worth consideration as an addition to the language.

Grammar Changes:
-----------------------------------------------------
ImportBindings:                    (existing rule)
     Import : ImportBindList        (existing rule)
     Import ~ ImportExcludeList     (new rule)

ImportExcludeList:                 (new rule)
     Identifier, ImportExcludeList  (new rule)
-----------------------------------------------------

import std.stdio;
import std.file;

void chdir(R)(R path) {
        writeln("changing dir to ", path);
    std.file.chdir(path);
}


void main()
{
    chdir("/tmp");
}

Reply via email to