- 1
- 2
Открытая встреча Национальной рабочей группы по стандартизации C++.
https://youtu.be/FcCymlVAtP8?t=3622
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−124
Открытая встреча Национальной рабочей группы по стандартизации C++.
https://youtu.be/FcCymlVAtP8?t=3622
Я тут вам немного ПОКУШАТЬ ПРИНЕС
Они там с этими constespr похоже окончательно двинулись.
Давайте мне constexpr-асмовставки cкорей, и чтоб с гомоиконностью
А эти убогие плюсокостыли - говно
Только если это не специализация шаблонной функции.
For constexpr function templates and constexpr member functions of class templates, at least one specialization must satisfy the abovementioned requirements. Other specializations are still considered as constexpr, even though a call to such a function cannot appear in a constant expression.
-- http://en.cppreference.com/w/cpp/language/constexpr
Если на то пошло - то constexpr тоже не добавил ничего нового. Метушня и без него метушилась.
З.Ы. Причём даже gc писать не надо - линкер справится сам.
Ну это если повезет, и метушня в процессе метушения не выжрет всю память
Например, можно написать функцию, которая вычисляет тип из значения, и компилятор сможет вызывать её при во время тайпчекинга.
К примеру, можно написать нормальный printf с компайл-тайм проверками в виде библиотеки, без необходимости вшивать их в компилятор, или проверять в компайл-тайме, что индексы в массивах не выходят за границы. Ещё есть totality checker, который умеет проверять, что функция определена для всех входов и производит конечное кол-во вычислений. Он работает на эвристиках, но в целом довольно умный.
Из-за того, что типы являются значениями, сущностей становится меньше, синтаксис становится более однородным. К примеру, тайпдефы больше не нужны:
Автор языка утверждает, что язык создан для практического использования (к примеру, он энергичный), там починили некоторые хаскелевские фейлы (String = [Char]? really?), но, как всегда, добавили своих (map f (x :: xs) = f x :: map f xs в энергичном языке? srsly?). Из приятного: качество интеграции компилятора с редактором кода (Atom/Emacs) приятно удивила, не припомню такого со времён tuareg-mode для ocaml.
До доказательства теорем в компайл-тайме я ещё не дочитал.
Вот тут есть две бесплатные главы: https://www.manning.com/books/type-driven-development-with-idris
Тут есть запись курса по идрису на русском, содержание по сути идентично тому, что содержится в книге http://compsciclub.ru/courses/idrisprogramming/2017-spring/ (смотреть рекомендую на скорости 1.5x, мужик как-то очень медленно говорит)
Могу отправить MEAP-версию книжки в epub/pdf, если скажешь, куда.
2. При конкатенации Vect n elem и Vect m elem получаем Vect (n + m) elem.
Вычисляемые типы? Да я этого джва года ждал.
Кстати, как с этим можно сравнить темплейты и дженерики + вывод типов в C++/C#/Java?
Жабьи дженерики даже рядом не лежали, они только типами параметризуются. В C# тоже только типами параметризовать можно.
А вот в плюсах можно сносно использовать зависимые типы, правда, в качестве значений может быть ограниченное кол-во сущностей (всяческие целые типы, указатели на члены класса). Основная проблема в том, что это обособленный и очень многословный суб-язык, на котором очень утомительно писать, и который бОльшая часть плюсовиков считает изотерикой.
Ещё забыл: в плюсах компайл-тайм и рантайм это две разных вселенных, и компилятор может оперировать только тем, что известно в компайл-тайме.
Допустим, мы хотим включить информацию о размере массива в его тип, чтобы проверять, что мы не выходим за границы этого массива. Это всё чудесно, пока тип массива содержит константу, а что если мы читаем массив с диска? В плюсах у нас нет вариантов, нужно выкинуть константу из типа и на этом успокоиться. Well, I've tried.
В Idris есть зависимые пары — функция может возвращать значение, тип которого зависит от того, что случится в рантайме. Например: Тут написано, что функция читает файл с заданным именем и возвращает пару число + массив, размер которого равняется этому числу. Компилятор заставит нас проверять при доступе к массиву, что индекс меньше n.