The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Релиз OpenSource реализации .Net-платформы Mono 2.10"
Отправлено Трухин_Юрий_Владимирович, 20-Фев-11 21:47 
> раскажите хоть одну задачу которая гладко решается с помощью метапрограммирования ?

метапрограммирование нужно для того, чтобы менять компиляционные структуры на этапе компиляции, т.е. добавлять или удалять элементы синтаксического дерева.
В 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.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру