Обзор последних фич
От: CodingUnit Россия  
Дата: 16.01.12 19:09
Оценка: 57 (8)
В ходе последних работ из подземелья вылезли новые фичи, какие то уже обсуждали, какие то нет, хотел все это обобщить и сделать маленький обзор, что знаю. Скоро будет полный релиз 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");


это было поправлено.

Ну авторы соответствующих коммитов могут сделать если захотят более подробные описания, я как успел на боевых листках записал описания Влада что он сделал, со своими и других изменениями, с последней полевой почтой отправляю на форум. Как смог попытался донести, чтобы объединить все что сделано в некий список с разъяснениями. Буду рад если кому будет это полезно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.