> раскажите хоть одну задачу которая гладко решается с помощью метапрограммирования ?метапрограммирование нужно для того, чтобы менять компиляционные структуры на этапе компиляции, т.е. добавлять или удалять элементы синтаксического дерева.
В Nemerle и Boo оно представлено в виде макросов. Макросы являются термином, который слабо связан с макросами из С/С++. Идея похожая конечно, но в том же Boo макросы намного мощнее. Пример создания свойства на языках C# и Boo.
C#
public int N {
get { return n; }
set { n = value; }
}
Boo
[Property(N)]
n as int
Этот пример очень хорошо иллюстрирует метапрограммирование. Cвойство `N` - это всего лишь сгенерированные методы `get_N()` и `set_N()`. Это можно встроить в язык, а можно приделать сверху. Какая от этого польза? Польза такая – в C# вы не можете переопределить то, как ведут себя свойства. В Boo это не проблема.
Можно использовать цитирование. Цитирование позволяет вместо вычисления выражения получить в объектной форме тот объект, который вы описали. Цитировение делается с помощью операторов `[|` и `|]`.
x = [| y + z |]
y + z
>>>x
y + z
>>>x.GetType().Name
'BinaryExpression'
>>>(x as BinaryExpression).Left
y
>>>(x as BinaryExpression).Right
z
выражение `y + z` получило тип BinaryExpression. Левую и правую части можно получить через ООП-структуры, которые определены в `Boo.Lang.Compiler` и `Boo.Lang.Compiler.Ast`.
Цитирование нужно для того, чтобы можно было прямо на этапе компиляции добавлять что-то в метод или класс. Например, если нужно добавить куда-то выражение `y + z`, не нужно создавать вручную объект типа `BinaryExpression`, присваивать ему параметры, и т.д. – можно просто сделать выражение и дальше работать с ним как с объектом.
далее предлагаю ознакомиться с терминами спалайс, мета-методы, ast и др. Писать тут обо всем этом слишком долго.
Для чего все это надо? Не так уж и часто возникает потребность генерировать что-либо на этапе компиляции. Но иногда все-таки такая потребность возникает. Один из примеров использования метапрограммирования – это геренация структур, где на основе простых данных нужно создать много “производных” методов и полей. В целом же, задачи метапрограммирования и того же АОР, например, очень схожи. Добавить логирование, трассировку, привить всем свойствам поддержку `INotifyPropertyChanged` – эти и другие задачи как раз решаются с помощью метапрограммирования, причем в отличии от АОР, где вы фактически ограничены тем инструментарием, который дает вам АОР-фреймворк, в метапрограммировании вы работаете с компилятором “без посредников”, что позволяет вам проще и точнее манипулировать структурами, не прибегая к использованию прослоечных библиотек или манипуляции IL.