Thread overview
mixin functions
Nov 01, 2012
Gor Gyolchanyan
Nov 01, 2012
Tobias Pankrath
Nov 01, 2012
Jacob Carlborg
Nov 01, 2012
H. S. Teoh
November 01, 2012
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.


November 01, 2012
> 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.
November 01, 2012
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
November 01, 2012
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