- Доклад
-
"Nemerle must die" «Nemerle deep dive» («Глубокое погружение в Nemerle»).
- Докладчик
- Чистяков Владислав, текущий maintainer, архитектор и идеолог языка Nemerle.
Рассказ о языке:
- Ядро языка;
- Вывод типов;
- Мимикрия под C# в области поддержки ООП;
- Поддержка функционального программирования:
- Функции как первоклассные значения;
- Алгебраические типы;
- Сопоставление с образцом;
- Гигиенические (LISP) макросы в Nemerle:
- Что такое? С чем едят?
- Как сочетаются с IDE и прочими технологиями?
- Сложности разработки, отладки, сопровождения.
- Развечание мифов;
- Ограничения версии 1.0;
- Что будет в Nemerle 2.0?
- Примеры практического использования макросов, прикладные макро-библиотеки:
- Nemerle.Xml — XML-литералы;
- Nemerle.Peg — быстрый и гибкий генератор парсеров шаговой доступности;
- ComputationExpressions:
- Асинхронное программирование;
- Yield внутри выражения;
- Другие применнения.
- Nemerle on Rails — миграции, автоматизация формирования ViewModel, движок рендеренга HTML «Spark»;
- Nemerle.WUI.Reactive — реактивный Web-интерфейс на основе статически типизированного языка вместо скриптов;
- Мелкие полезняшки:
- Автоматизация реализации зависимых свойств в WPF
- Record — автоматизация создания конструкторов
- Автоматизация паттернов проектирования ООП (Abstract factory, Aggregate, Proxy, Singleton)
- Late-binding — позднее связывание
- Surroundwith — создание аналогов using и lock в мгновение ока.
- Memoize
- $-строки
- Assertions
- ListComprehension
- Regexp match
- StructuralEquality, LexicographicCompareTo, StructuralHashCode
- .. и многое другое.
Видеозапись
4 часа! Четыре части по часу!
Внимание! Данная статья выбрана для репликации во внешнюю базу знаний компании. Пожалуйста, не допускайте в этой статье публикацию конфиденциальной информации, ведения обсуждений в теле статьи, и более ответственно относитесь к качеству самой статьи — проверяйте орфографию, пишите по-русски, избегайте непроверенной вами информации.
Примечания
- Обсуждения — «Nemerle — да или нет?»
На недавно прошедшем семинаре по Nemerle Владислав Чистяков, его текущий maintainer, впал в ступор, пытаясь определить тип выражения
throw NotImplementedException();
, и был несказанно удивлен, когда удалось написать что-то вроде
def a : int = throw NotImplementedException();
def b : void = throw NotImplementedException();
Честно говоря, его удивление само по себе немного удивительно, учитывая, что он ковырял много разных языков программирования, и Хаскель в том числе.
Таки вот — это выражение сигнализирует, грубо говоря, о том, что во время выполнения некой функции случилась некая задница. Кстати, именно так её и называют некоторые вполне серьезные люди — bottom (для краткости иногда обозначая её значком _|_). Исключение — это не единственное проявление задницы, бывает ещё бесконечная рекурсия.
Так какой же она может иметь тип? Ну, очевидно, задница может случиться во время выполнения абсолютно любой функции. А абсолютно любая функция может иметь абсолютно любой тип. То есть — задница может иметь абсолютно любой тип, она полиморфна! А тип того, что может иметь абсолютно любой тип, записывается в C# примерно так:
public static T Bottom<T>()
{
throw new NotImplementedException();
}
Причина неимоверной популярности задницы именно среди хаскеллистов объясняется ленивостью этого популярного языка. Ленивость — это передача туда-сюда «недовычисленных» выражений. Она, с одной стороны, дает преимущества в модульности кода (эти преимущества в какой-то степени должны быть знакомы и сишарпистам — весь Linq крутится вокруг «слегка ленивых» списков), но, с другой стороны, каждое из недовычисленных выражений может содержать в себе Её. Задницу.