在编译时迭代类型的成员

时间:2011-06-27 22:31:50

标签: programming-languages

是否存在任何静态类型的强类型编译语言,它提供了在编译时迭代类型成员并为每个成员生成模板化代码的功能?例如,它可能是这样的:

// in pseudo-C#

public static void AddParameter(string parameterName, object value) { /* ... */ }

public static void AddParameters<T>(T parameters) {
    // Of course, the memberof(T), membersof(T), membername(<member>)
    // and membervalue(<member>, object) operators would be valid
    // inside a "compile for" block only
    compile for (memberof(T) member in membersof(T))
        AddParameter(membername(member), membervalue(member, parameters));

    /* If this were actual C#, the "compile for" block could even have a where clause */
}

因此,如果进行了以下调用:

StaticClass.AddParameters(new { UserID = "eleon", Password = "Gu3$$17" });

然后将AddParameters的特定实例化展开到

public static void AddParameters(InternalNameOfTheAnonymousType parameters) {
    AddParameters("UserID",   parameters.UserID);
    AddParameters("Password", parameters.Password);
}

在编译时(如果它是IL到本机编译时的实际C#)

2 个答案:

答案 0 :(得分:4)

您可以使用Nemerle完成此操作。

答案 1 :(得分:3)

这里的句法荆棘很厚,所以我很难看到你得到的是什么,但我认为Haskell的Scrap Your Boilerplate可能足够强大,可以做到这一点。它当然能够进行一些惊人的编译时通用元编程。