Upload
dev2devconf
View
484
Download
7
Embed Size (px)
Citation preview
Метапрограммирование в .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 Contravariance, Static classes
C#
3.0
200
8
Implicitly typed local variables, Object and collection initializers, AutoImplemented 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 autoproperties, Getteronly autoproperties, Expressionbodied function members, Expression bodies on methodlike members, Expression bodies on propertylike function members, Using static, Nullconditional 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 autoproperties, Getteronly autoproperties, 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 autoproperties, 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 ● Анализ кода, compiletime проверки
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: конструктор отчетов
63
Недостатки Nemerle
● Медленный компилятор ● Слабая и разрозненная документация ● Сбои в интеграции Visual Studio ● Малое количество макробиблиотек для
65
Достоинства Nemerle
● Генерация кода ● Простота при переходе с C# ● Возможности полноценного функционального языка
● Выразительность и красота кода (субъективно)
● Расширение синтаксиса
66
Будущее Nemerle – Nitra
67
Спасибо!
http://nemerle.org/
https://github.com/rsdn/nemerle
http://rsdn.ru/?forum/nemerle/
68