SlideShare a Scribd company logo
 
 
 
Метапрограммирование в .NET 
Nemerle 
   
1 
Обо мне 
 
Александр Зимин 
https://github.com/ziaw 
 
.NET / Ruby   
тимлид/архитектор/предприниматель 
 
2 
Nemerle 
 
Мультипарадигменныйязык общего 
назначения для платформы .NET. 
 
Разработка языка началась в 2003 
году в университете Вроцлава 
(Польша). 
3 
Lord Nemmerle was Archmage 
 
Lord Nemmerle was Archmage, 
Warder of the School for 
Wizards on Roke Island. 
 
He has a pet raven and wears 
white robes. 
   Ursula Le Guin    
   
4 
Nemerle ­ язык будущего 
 
5 
Эволюция C# (37 features) 
Version  Year  Features 
C# 
2.0 
200
5 
Generics, Partial types, Anonymous methods, Iterators, Nullable types, Private 
setters (properties), Method group conversions (delegates), Covariance and 
Contra­variance, Static classes 
C# 
3.0 
200
8 
Implicitly typed local variables, Object and collection initializers, 
Auto­Implemented properties, Anonymous types, Extension methods, Query 
expressions, Lambda expressions, Expression trees, Partial Methods 
C# 
4.0 
201
0 
Dynamic binding (late binding), Named and optional arguments, Generic co­ and 
contravariance 
C# 
5.0 
201
2 
Async features 
Caller information 
C# 
6.0 
201
5 
Initializers for auto­properties, Getter­only auto­properties, Expression­bodied 
function members, Expression bodies on method­like members, Expression 
bodies on property­like function members, Using static, Null­conditional 
operators, String interpolation, nameof, Index initializers, Exception filters, Await 
in catch and finally blocks, Extension Add methods in collection initializers, 
Improved overload resolution 
6 
 
   
7 
Nemerle 2004 года (21/37 57%) 
Versi
on 
Year Features 
C# 
2.0 
2005  Partial types, Iterators, Nullable types, Private setters (properties) 
C# 
3.0 
2008 
Object and collection initializers, Anonymous types, Extension methods, 
Query expressions, Partial Methods 
C# 
4.0 
2010   
C# 
5.0 
2012 
Async features 
Caller information 
C# 
6.0 
2015 
Initializers for auto­properties, Getter­only auto­properties, nameof, Index 
initializers, Await in catch and finally blocks, Extension Add methods in 
collection initializers 
8 
 
   
9 
Минус возможности расширения в 2004 (24/37 65%) 
Versi
on 
Year  Features 
C# 
2.0 
2005  Partial types, Iterators, Nullable types, Private setters (properties) 
C# 
3.0 
2008  Extension methods, Partial Methods 
C# 
4.0 
2010   
C# 
5.0 
2012 
Async features 
Caller information 
C# 
6.0 
2015 
Initializers for auto­properties, Await in catch and finally blocks, Extension 
Add methods in collection initializers 
 
   
10 
Минус возможности C# поддерживаемые Nemerle на текущий 
момент (34/37) 
Versi
on 
Year Features 
C# 
2.0 
200
5 
 
C# 
3.0 
200
8 
Partial Methods 
C# 
4.0 
201
0 
 
C# 
5.0 
201
2 
Async features 
Caller information 
C# 
6.0 
201
5 
Await in catch and finally blocks 
11 
 
 
   
12 
Это все прошлое, где будущее? 
   
13 
C# 7 
 
• Tuples 
• Pattern matching 
• Records/ADTs 
• Nullability tracking 
• Async streams and disposal, Strongly typed access to 
wire formats, More support for expression trees 
(statements, more expressions),  Syntax for lists, 
Immutable types, Type providers, Existing or other ways 
of adding attributes, Method contracts, Local functions 
 
 
14 
Nemerle сейчас 
•Tuples 
•Pattern matching 
•Records/ADTs 
More support for expression trees (statements, 
more expressions),  Syntax for lists​, ​Existing or 
other ways of adding attributes​, ​Local functions 
 
 
Immutable types, Type providers делаются на макрросах 
15 
Мультипарадигменный язык 
 
 
 
 
Nemerle = OOP + FP + MP 
 
 
Nemerle = C# + F# + Lisp(?) 
 
   
16 
Nemerle больше всего похож на C# 
C#           Nemerle 
17 
Дополнительные примитивные типы 
 
 
 
 
 
 
 
 
   
18 
Дополнительные примитивные типы 
 
 
 
 
 
 
   
19 
Дополнительные примитивные типы 
 
 
 
 
20 
Вывод типов Хиндли­Милнера 
 
 
 
 
21 
Локальные функции и вывод типов 
 
 
 
22 
Ключевые функциональные возможности F# 
 
 
   
23 
Все есть выражение. Expression rather then statement. 
 
 
 
   
24 
Все есть выражение. Expression rather then statement. 
 
 
 
   
25 
 
Все есть выражение. Expression rather then statement. 
 
 
   
26 
Все есть выражение. Expression rather then statement. 
 
 
 
 
 
 
 
 
 
   
27 
Все есть выражение. Expression rather then statement. 
 
 
 
 
 
 
 
 
 
 
 
28 
Паттерн матчинг 
 
 
   
29 
Примеры паттернов 
 
 
 
30 
Примеры паттернов. Литерал. 
 
 
 
   
31 
Примеры паттернов.  Переменная. 
 
   
32 
Примеры паттернов.  Кортеж. 
 
 
 
 
   
33 
Примеры паттернов. Класс. 
 
   
34 
 
Алгебраические типы данных 
 
 
 
35 
ATD и паттерн матчинг 
 
 
 
 
 
   
36 
ATD и паттерн матчинг 
 
 
37 
Example: Immutable binary tree 
 
 
38 
Функциональный тип и операции над ним 
 
 
 
39 
Частичное применение 
 
 
 
 
 
 
 
 
40 
Композиция 
 
 
 
41 
Конвейер 
 
 
42 
Метапрограммирование 
 
43 
 
     
Метапрограммирование 
 
● Параметрический полиморфизм (generics) 
● Кодогенерация 
● Domain Specific Languages 
● Анализ кода, compile­time проверки 
 
   
44 
Метапрограммирование в Nemerle 
 
 
● Код, который запускается во время компиляции и 
генерирует основной код 
● Код, который может анализировать и модифицировать 
компилируемый код 
● Синтаксические расширения для языка 
 
   
45 
Генерация кода 
 
T4  Дерево выражений 
 
 
 
46 
Генерация кода 
 
T4  Дерево выражений 
 
 
При усложнении код превращается в 
лапшу  
Объем кода генератора в разы 
превышает генерируемый. Плохая 
читабельность. 
47 
Квазицитирование! 
 
Дерево выражений  Квазицитата 
 
 
   
48 
Код, который запускается во время 
компиляции 
 
   
49 
Макрос 
 
 
 
 
 
50 
Использование макроса 
 
 
 
 
 
51 
Параметры в квазицитатах 
 
 
 
 
 
 
 
 
   
52 
Делаем цикл 
 
 
53 
Используем цикл 
 
 
 
   
54 
Расширяем синтаксис 
 
 
 
Так гораздо лучше 
   
55 
Макрооператор 
 
   
56 
Макроатрибут 
 
   
57 
 
Квазицитирование. Разбор выражения. 
 
Дерево выражений  Квазицитата 
 
 
 
   
58 
Зачем нужны DSL и расширение 
синтаксиса? 
 
   
59 
Примеры DSL: JSON 
 
 
60 
Примеры DSL: Nemerle.PEG 
 
 
   
61 
Примеры DSL: Nemerle.Web 
 
http://www.nemerleweb.com/ 
62 
Примеры DSL: конструктор отчетов 
 
   
63 
Nemerle Pad 
 
https://github.com/ziaw/npad 
   
64 
Недостатки Nemerle 
 
● Медленный компилятор 
● Слабая и разрозненная документация 
● Сбои в интеграции Visual Studio 
● Малое количество макробиблиотек для  
 
 
65 
Достоинства Nemerle 
 
● Генерация кода 
● Простота при переходе с C# 
● Возможности полноценного функционального 
языка 
● Выразительность и красота кода 
(субъективно) 
● Расширение синтаксиса 
 
 
66 
Будущее Nemerle – Nitra 
 
 
 
 
 
 
 
 
 
   
67 
Спасибо! 
 
 
http://nemerle.org/ 
 
https://github.com/rsdn/nemerle 
 
http://rsdn.ru/?forum/nemerle/ 
 
 
 
68 

More Related Content

More from Dev2Dev

D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
Dev2Dev
 
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
Dev2Dev
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
Dev2Dev
 
D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"
Dev2Dev
 
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
Dev2Dev
 
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
Dev2Dev
 
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NETВсё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
Dev2Dev
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
Dev2Dev
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Dev2Dev
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
Dev2Dev
 
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NETЭволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Dev2Dev
 
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NETMicro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Dev2Dev
 
Трудности повторного использования
Трудности повторного использованияТрудности повторного использования
Трудности повторного использования
Dev2Dev
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
Dev2Dev
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.
Dev2Dev
 
Разработка приложений в Android studio
Разработка приложений в Android studioРазработка приложений в Android studio
Разработка приложений в Android studio
Dev2Dev
 
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Dev2Dev
 
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
Dev2Dev
 
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Dev2Dev
 
Линзы - комбинаторная манипуляция данными Александр Гранин Dev2Dev v2.0 30.05...
Линзы - комбинаторная манипуляция данными Александр Гранин Dev2Dev v2.0 30.05...Линзы - комбинаторная манипуляция данными Александр Гранин Dev2Dev v2.0 30.05...
Линзы - комбинаторная манипуляция данными Александр Гранин Dev2Dev v2.0 30.05...
Dev2Dev
 

More from Dev2Dev (20)

D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
 
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
 
D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"
 
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
 
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
 
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NETВсё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
 
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NETЭволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
 
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NETMicro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
 
Трудности повторного использования
Трудности повторного использованияТрудности повторного использования
Трудности повторного использования
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.
 
Разработка приложений в Android studio
Разработка приложений в Android studioРазработка приложений в Android studio
Разработка приложений в Android studio
 
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
 
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
Принцип YAGNI в управлении проектами - Анна Тарасенко Dev2Dev v2.0 30.05.2015
 
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
 
Линзы - комбинаторная манипуляция данными Александр Гранин Dev2Dev v2.0 30.05...
Линзы - комбинаторная манипуляция данными Александр Гранин Dev2Dev v2.0 30.05...Линзы - комбинаторная манипуляция данными Александр Гранин Dev2Dev v2.0 30.05...
Линзы - комбинаторная манипуляция данными Александр Гранин Dev2Dev v2.0 30.05...
 

Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET