Timon Gehr wrote:
Ah, I see what you are getting at. I failed to read your post carefully enough. Sorry about that.

Hakuna matata ;)


It is a parameterized scope that is analysed upon instantiation.

Yes, but my request is to have an un-parameter-atized syntax which is sugar for a template with zero parameters and is useful for sub-scoping objects. See below for a more detailed argument.


This is an alternative:

private template _unsafe(){
    string name;
    void bar() {
        writeln(name);
    }
}
struct Foo{
    mixin _unsafe Unsafe;
}

Is this better? (_unsafe can be a local template of struct Foo, but then it invades the allMembers)

Not really. Reasons is I actually want _unsafe to be part of allMembers, but I also want to use it in a syntactically appealing way. Also, by separating the template from the object, you're (conceptually) breaking OOP design, unless _unsafe is designed as a reusable packet of code (ie, used by more than just Foo, like UFCS), which isn't the goal I intended. Here's another example:

    class Fighter : Ship
    {
      template visual {
        VisualMesh mesh;

        void update() { /* use visual.mesh */ }
        void updateAfter() { /* ditto */ }
      }

      template physic {
        CollisionMesh mesh;

        void udpate() { /* use physic.mesh */ }
      }

      void update() {
        visual.mesh.doSomething();
        physic.mesh.doSomething();
      }
    }

Now we have three functions "update", and two fields "mesh", without any conflicts because they're separated by scope. The classic way to do this is simply to prefix the names: visualMesh, visualUpdate, physicMesh, etc... but scoping fits with OOP design, and allows each sub-scope to use each variable without prefixing, eg, "visual.update()" doesn't need to prefix "visual." when using "visual.mesh".

I know that this can be today, though alternative ways. However, this requires very little prior knowledge of D's idioms to understand. Meaning non-D programmers will understand this at a glance. It makes sense, and code is where it should be, saving us all a little bit of head-ache.


What may also be prudent, is to have parameterless mixin templates, something like:

    struct Person
    {
      mixin intros = template {
        void sayHi() { ... }
        void sayAge() { ... }
      }

      void sayHi() {
        intros.sayHi();
        intros.sayAge();
      }
    }

    void main() {
      auto philip = Person();

      philip.sayHi();
      philip.sayAge();
      philip.intros.sayHi();
    }

The problem with always using mixin templates is that sometime you want to require the scope prefix, like in the Ship example above.


I think the current syntax hardly qualifies as unusable. I agree that it is not the prettiest/most specific one imaginable.

Agreed, though I don't see that as a reason to not *eventually* introduce a more usable syntax. If I had more time to dick around with DMD's internals, I'd make a pull request myself. I'm learning it, but it'll be awhile before I'll be trying to push code.


Well, it can do it already.

Yes it can, but just even simple realiasing a template (or separating it out like your examples) requires a deeper understanding of D than what's graspable from my simple Ship example above. The easier to grasp, the more passing developer it will impress.


D's design sacrifices ease of implementation to some extent.

I don't think it needs too, though. We could have both.

Reply via email to