mixin in Nemerle

Nemerle 0.9.2からProxyPublicMembersマクロがサポートされました。この属性を付けると、オブジェクトの持つpublicなメンバへの委譲が自動生成されます。

using System;
using Nemerle.Utility;
using Nemerle.DesignPatterns;

class Programmer {
    [Accessor]
    lang : string;
    this (lang : string) {
        this.lang = lang;
    }

    public static Create (lang : string) : Programmer {
        Programmer (lang);
    }

    public WriteCode () : void {
        Console.WriteLine ($"Programming in $lang");
    }

}

class Singer {
    this () {}

    public static Create () : Singer {
        Singer ();
    }

    public Sing () : void {
        Console.WriteLine ("Sing a song.");
    }
}

class Dancer {
    this () {}

    public static Create () : Dancer {
        Dancer ();
    }

    public Dance () : void {
        Console.WriteLine ("Dance to the music.");
    }
}

class SuperProgrammer {
    [ProxyPublicMembers]
    programmer : Programmer;

    [ProxyPublicMembers]
    singer : Singer;

    [ProxyPublicMembers]
    dancer : Dancer;

    public this (lang : string) {
        programmer = Programmer.Create (lang);
        singer = Singer.Create ();
        dancer = Dancer.Create ();
    }
}

// 歌って踊れるプログラマ
def hacker = SuperProgrammer ("C#");
Console.WriteLine (hacker.Lang);
hacker.WriteCode ();
hacker.Sing ();
hacker.Dance ();

/*
C#
Programming in C#
Sing a song.
Dance to the music.
 */

ただ、現在のマクロはpublicなコンストラクタまで委譲してしまい、コンストラクタが重複してしまいます。取りあえず、Creation Methodを作って逃げました。