В ходе последних работ из подземелья вылезли новые фичи, какие то уже обсуждали, какие то нет, хотел все это обобщить и сделать маленький обзор, что знаю. Скоро будет полный релиз 1.1 где все это будет уже в обертке и надеюсь с ченджлистом, и обзором что было сделано. Так пока самые интересные фичи обрисую:
Основной список улучшений, по порядку появления:
1) исправлены горы багов для конвертации С# в Nemerle, для этого внедрены многие похожие фичи
2) поддержка слова sizeof для основных примитивных типов, включая decimal
3) сделана поддержка поведения partial как в C#
4) сделана возможность объединять строки с другими типами через +
5) полная поддержка параметров по умолчанию в квазицитатах
6) возможность избегать ключевого слова where в паттерн матчинге (для классов, интерфейсов, базовых вариантов)
7) улучшен макрос StructureEquality, для поддержки вариантов и избавлен от боксинга типов
8) поддержка маленьких букв для классов (всех типов кроме вариантов) в ПМ
9) исправлен баг при использовании лямбд в качестве параметров по умолчанию в локальных функциях
Хочется поговорить о них подробней:
1) Сначала хочется поговорить о конвертации C#. Влад во всю трудится чтобы один большой проект на C#, был переведен на Nemerle, там такие горы кода что было исправлено очень много багов и теперь поддержка C# на более новом уровне.
2) В связи с этим добавлен макрос sizeof поведение которого аналогично оператору sizeof для обычных типов
3)
Поведение partial теперь такое же как в C#
раньше такой код давал ошибки:
partial public class HU { }
partial class HU { } // E: joined partial classes `HU' must have compatible modifiers
теперь это возможно:
partial public class HU { }
partial class HU { } // It's OK. See 10.2.2 Modifiers of C# spec.
хотя такой по прежнему ошибка:
partial public class HU { } // H: part with incompatible modifiers
partial internal class HU { } // E: joined partial classes `HU' must have compatible modifiers
4) Интересная фича, на что многие жаловались что нельзя сложить строку с примитивным типом, например:
"ABC" + 3
хотя эта фича теряет цвет на фоне сплайс строк, но тем не менее она есть.
5) Раньше не очень хорошо работали квазицитаты с параметрами по умолчанию, сам не раз натыкался на это, теперь и создание квазицитат с параметрами по умолчанию и матчинг подобных цитат, работает как ожидается:
def parm = <[parameter: public $(name : usesite) : int = 0 ]>;
match (parm)
{
| <[parameter: ..$attr $(n : name) : $ty = $deflt ]> => // do something
}
def parms = parm :: [];
def ty = typebuilder.Define(<[ public Func(..$parms) {} ]>);
6) Интересная фича позволяющая сильно сократить код, использующий ПМ, опускание слова where, о ней уже было немало говорено. На фоне вариантов, объявление классов могло быть очень нагруженным и мешало декларативности их описания, раньше, приходилось писать так:
| Class where (field = SubClass where (field2 = A, fieldb = C))) =>
теперь возможно так:
| Class(field = SubClass(A, C))) =>
| ISomeInterface(Property = a) => // можно тестировать свойства интерфейса
к возможным типам использующим этот синтаксис принадлежат interface, class, enum, variant (базовый класс), с ними работают все паттерны, конструктор, record и другие. Старый синтаксис для совместимости работает.
7) Влад поправил макрос StructureEquality который стал поддерживать варианты и стал более оптимизирован, ранее было использование боксинга при сравнении полей примитивных типов, теперь это исправлено.
8) Для полной поддержки различных типов в ПМ, была внесена возможность использования маленьких букв в паттерн матчинге, наряду с большими:
| A => // как тип
| x => // как переменная
| A(a, b) => // как конструктор с присвоением двух полей переменным
| a(x, y) => // здесь a также подразумевается тип, и x y поля
| A as var => // обычный as паттерн
| a as var => // а также тип
| x is A => // is паттерн
| x is a => // маленькие буквы работают
9) Исправлен досадный баг который исправил параметры по умолчанию в локальных функциях, например такой код давал ошибку:
def func(a, b = () => true)
{
}
func("123");
func("123");
это было поправлено.
Ну авторы соответствующих коммитов могут сделать если захотят более подробные описания, я как успел на боевых листках записал описания Влада что он сделал, со своими и других изменениями, с последней полевой почтой отправляю на форум. Как смог попытался донести, чтобы объединить все что сделано в некий список с разъяснениями. Буду рад если кому будет это полезно.