Reducing the inter-dependencies (in Phobos and at large)gei
renariko at yahoo.com
renariko at yahoo.com
Wed Apr 24 08:41:46 PDT 2013
On Wednesday, 24 April 2013 at 12:03:52 UTC, Dmitry Olshansky
wrote:
> Recently I've struggled again to integrate a module in Phobos
> and the amount of curious forward reference bugs made think
> about a related but not equivalent problem.
>
> Intro
>
> Basically an import graph of Phobos is a rat's nest of mutual
> imports.
> With the most of modules being template "toolkits" you
> shouldn't pay for what you don't use. Yet it isn't true in
> general as the module may drag in other modules and with that
> all of static constructors and/or globals related.
>
> Adding even more fun to this stuff - to get a "constraint
> checker" you have to import all other stuff from that module
> (and transitively from all imported by it modules, see
> std.range example below).
>
> One motivating example (though I believe there are much more
> beyond this one):
>
> As some might know regular expression engine can be used for
> both generating sequences for a known pattern and
> matching/finding pieces that do match it in some data.
>
> In fact I have such a functionality in std.regex hidden from
> public interface (not yet complete, wasn't sure of the kind of
> API etc.).
>
> Now the *key* fact:
>
> auto generate(RegEx, rng) (RegEx re, Random rng)
> if(isRegex!RegEx && isUniformRNG!Random)
> {
> ...
> }
>
> Now given that innocent signature you have dependency on the
> whole of std.random *including* seeding the default random
> number generator at the program start!
>
> And recall that generating strings while neat is arguably more
> rare need then pattern matching.
>
> Same thing with std.datetime - to get an ability to accept any
> kind of Date as a template parameter (in your API) you have to
> get the whole std.datetime *even if the user never ever calls
> this function* of your module API.
>
> And everyone and their granny depends on full version of
> std.range
> that in turn depends on std.algorithm that depends on std.conv
> that depends on std.format(!) and that incidentally on std.uni.
> BTW std.uni turns out to be a kind of sink everybody imports
> sooner or later if only for unittests, sadly it's mostly
> imported unconditionally.
>
> And that skipping a full rat's nest to preserve the brains of
> the reader.
>
> After a couple of frustrating evenings dealing with it
> (multiplied by the bogus dmd) I've come up with the idea below.
>
>
> Solution
>
> First of all no compiler magic required (phew-ew!) :)
>
> Not to mention the 2 obvious facts - smaller modules might
> help, as would guarding by version(unittest) imports used only
> for unit tests.
>
> What we need is to re-arrange the module hierarchy (and we need
> that anyway) so that we split off the "concept" part of modules
> to a separate package.
>
> That would allow modules that need this to use these Duck-typed
> entities (IFF the user ever passes such an entity) can stick
> with importing only the concept part.
>
> Applying that to the current layout would look like:
> std.concept.range
> std.concept.random
> std.concept.* //every other module with any useful isXYZ
> constraint
> std.* // stays as is
>
> Any module that has "concept" part then looks like this:
>
> module std.xyz;
> import std.concept.xyz;
> ... //the rest
>
> And then other weakly-dependent modules (i.e. these that are
> satisfied with traits and duck-typed interfaces) can safely
> import std.concept.xyz instead of std.xyz. E.g. std.regex would
> import std.concept.random to get isUniformRNG and rely on duck
> typing thusly described to use it correctly.
>
> The change is backwards compatible and introduces no breakage.
> Only clean sugar-free interdependence of modules in Phobos.
>
> Later people (mostly library writers) can use e.g.
> std.concept.range
> to avoid pulling full dependency tree in case only constraints
> are needed. The technique can be touted as coding guideline for
> template and duck-type heavy libraries.
>
> Thoughts? Other ideas?
More information about the Digitalmars-d
mailing list