Перебор членов типа во время компиляции - PullRequest
0 голосов
/ 28 июня 2011

Существует ли какой-либо статически типизированный, строго скомпилированный язык, обеспечивающий функциональность для перебора членов типа во время компиляции и генерации шаблонного кода для каждого из них?Например, это может быть что-то вроде:

// 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);
}

Во время компиляции (если это был фактический C # во время компиляции IL-to-native)

Ответы [ 2 ]

4 голосов
/ 28 июня 2011

Вы можете сделать это с Nemerle .

3 голосов
/ 28 июня 2011

Синтаксические бриары здесь толстые, поэтому мне трудно понять, к чему вы клоните, но я думаю, что Scrap Your Boilerplate на Haskell может быть достаточно мощным, чтобы выполнить трюк. Конечно, он способен на удивительное обобщенное метапрограммирование во время компиляции.

...