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を作って逃げました。