There is no need to import std.stdio at top level, so fun carries its own
dependencies. The same approach can be used for template constraints:
voidfun(T)(imported!"std.stdio".Fileinput, Tvalue)
if (imported!"std.traits".isIntegral!T)
{
...
}
An inline import may be used in conjunction with the with statement as well.
Inside the scope controlled by with, all symbols in the imported module are
made available:
voidfun()
{
with (imported!"std.datetime")
with (imported!"std.stdio")
{
Clock.currTime.writeln;
}
}
The advantages of inline imports over top-level uses of the import declaration
are the following:
The imported template specifies dependencies at declaration level, not at
module level. This allows reasoning about the dependency cost of declarations in
separation instead of aggregated at module level.
Declarations using imported are easier to move around because they don't
require top-level context, making for simpler and quicker refactorings.
Declarations using imported scale better with templates. This is because
templates that are not instantiated do not have their parameters and constraints
instantiated, so additional modules are not imported without necessity. This
makes the cost of unused templates negligible. Dependencies are pulled on a need
basis depending on the declarations used by client code.
The use of imported also has drawbacks:
If most declarations in a module need the same imports, then factoring them
at top level, outside the declarations, is simpler than repeating them.
Traditional dependency-tracking tools such as make and other build systems
assume file-level dependencies and need special tooling (such as rdmd) in order
to work efficiently.
Dependencies at the top of a module are easier to inspect quickly than
dependencies spread throughout the module.
Provides an "inline import", i.e. an import that is only available for a limited lookup. For example:
There is no need to import std.stdio at top level, so fun carries its own dependencies. The same approach can be used for template constraints:
An inline import may be used in conjunction with the with statement as well. Inside the scope controlled by with, all symbols in the imported module are made available:
The advantages of inline imports over top-level uses of the import declaration are the following:
The use of imported also has drawbacks: