www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - mixin functions

reply Gor Gyolchanyan <gor.f.gyolchanyan gmail.com> writes:
I find myself doing this very very often and it pains me to write ugly code
like this over and over again:

mixin(()=>{

    string result;
    foreach(i; 0..10)
        result ~= "writeln(" ~ to!string(i); ~ ");\n"'
    return result;

}());

All it does is generates a string in a delegate, which is immediately
called and passed to a mixin.
Almost all mixins contain generated strings and most if them need a
dedicated string generator.
I don't want to propose new syntax, because we all know that new syntax is
the last thing that will be developed, considering the number of bugs out
there. The first thing I wanted to do was this:

mixin
{
    foreach(i; 0..10)
        mixin ~= "writeln(" ~ to!string(i); ~ ");\n"'
}

I'm not suggesting this to be implemented, this is just what I
automatically wanted to write.
Anybody else had this kind of thoughts?

-- 
Bye,
Gor Gyolchanyan.
Nov 01 2012
next sibling parent "Tobias Pankrath" <tobias pankrath.net> writes:
 I'm not suggesting this to be implemented, this is just what I
 automatically wanted to write.
 Anybody else had this kind of thoughts?
I think that code generating mixin strings should be as well designed and documented as every other code you write. This mixin feature would be just another step to gain C's preprocessor's reputation for string mixins.
Nov 01 2012
prev sibling parent reply Jacob Carlborg <doob me.com> writes:
On 2012-11-01 16:55, Gor Gyolchanyan wrote:
 I find myself doing this very very often and it pains me to write ugly
 code like this over and over again:

 mixin(()=>{

      string result;
      foreach(i; 0..10)
          result ~= "writeln(" ~ to!string(i); ~ ");\n"'
      return result;

 }());

 All it does is generates a string in a delegate, which is immediately
 called and passed to a mixin.
 Almost all mixins contain generated strings and most if them need a
 dedicated string generator.
 I don't want to propose new syntax, because we all know that new syntax
 is the last thing that will be developed, considering the number of bugs
 out there. The first thing I wanted to do was this:

 mixin
 {
      foreach(i; 0..10)
          mixin ~= "writeln(" ~ to!string(i); ~ ");\n"'
 }

 I'm not suggesting this to be implemented, this is just what I
 automatically wanted to write.
 Anybody else had this kind of thoughts?
I would vote for AST macros instead. -- /Jacob Carlborg
Nov 01 2012
parent "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Thu, Nov 01, 2012 at 08:31:30PM +0100, Jacob Carlborg wrote:
 On 2012-11-01 16:55, Gor Gyolchanyan wrote:
I find myself doing this very very often and it pains me to write
ugly code like this over and over again:

mixin(()=>{

     string result;
     foreach(i; 0..10)
         result ~= "writeln(" ~ to!string(i); ~ ");\n"'
     return result;

}());

All it does is generates a string in a delegate, which is immediately
called and passed to a mixin.
Almost all mixins contain generated strings and most if them need a
dedicated string generator.
I don't want to propose new syntax, because we all know that new
syntax is the last thing that will be developed, considering the
number of bugs out there. The first thing I wanted to do was this:
[...]
 I would vote for AST macros instead.
[...] Yeah, mixins are a kind of hack that's unfortunately rather widely used right now. A proper AST macro system would be much better. But I'm not holding my breath for it, given how many issues we still have to fix with our current feature set. T -- Indifference will certainly be the downfall of mankind, but who cares? -- Miquel van Smoorenburg
Nov 01 2012