Size: a a a

2021 February 02

ID

Iv@n Dereviankin in rust_offtopic
Stanislav Ershov
поговнокодил <на чем угодно> => иди оптимизируй
Хм
источник

ID

Iv@n Dereviankin in rust_offtopic
Ну можно и так
источник

ID

Iv@n Dereviankin in rust_offtopic
Iv@n Dereviankin
То бишь, поговнокодил на сях => сразу быстрый код
Хотя это можно и оставить
источник

CD

Constantine Drozdov in rust_offtopic
Первое, что логично выразить через шаблоны в C++, это очередь с приоритетом. На C она представлена в виде структуры, главный элемент которой — указатель на массив указателей на узлы с данными:
источник

CD

Constantine Drozdov in rust_offtopic
дальше можно не читать
источник

SE

Stanislav Ershov in rust_offtopic
Constantine Drozdov
Первое, что логично выразить через шаблоны в C++, это очередь с приоритетом. На C она представлена в виде структуры, главный элемент которой — указатель на массив указателей на узлы с данными:
😐
источник

SE

Stanislav Ershov in rust_offtopic
Constantine Drozdov
Первое, что логично выразить через шаблоны в C++, это очередь с приоритетом. На C она представлена в виде структуры, главный элемент которой — указатель на массив указателей на узлы с данными:
а не, все тот чат)
источник

SE

Stanislav Ershov in rust_offtopic
таких
источник

CD

Constantine Drozdov in rust_offtopic
struct char_node_base
{
   virtual ~char_node_base() = default;
};

using char_node_ptr = std::unique_ptr<char_node_base>;

struct char_node_terminal : char_node_base
{
   const unsigned char m_c;
   char_node_terminal(char c) noexcept : m_c(c) {}
};

struct char_node : char_node_base
{
   char_node_ptr m_left;
   char_node_ptr m_right;
};

если тебе нужна будет PQ - тщательно запоминай
источник

SE

Stanislav Ershov in rust_offtopic
Constantine Drozdov
struct char_node_base
{
   virtual ~char_node_base() = default;
};

using char_node_ptr = std::unique_ptr<char_node_base>;

struct char_node_terminal : char_node_base
{
   const unsigned char m_c;
   char_node_terminal(char c) noexcept : m_c(c) {}
};

struct char_node : char_node_base
{
   char_node_ptr m_left;
   char_node_ptr m_right;
};

если тебе нужна будет PQ - тщательно запоминай
блин, "так, их" а то они тут опять устроили срач Сишка лучше плюсов
источник

CD

Constantine Drozdov in rust_offtopic
Stanislav Ershov
блин, "так, их" а то они тут опять устроили срач Сишка лучше плюсов
жалко товарищ не сравнил со встроенной реализацией в питоне
источник

CD

Constantine Drozdov in rust_offtopic
питон как всегда всех бы задушил
источник

EG

Emmanuel Goldstein in rust_offtopic
Constantine Drozdov
Первое, что логично выразить через шаблоны в C++, это очередь с приоритетом. На C она представлена в виде структуры, главный элемент которой — указатель на массив указателей на узлы с данными:
? Типичный C, казалось бы
источник

CD

Constantine Drozdov in rust_offtopic
Emmanuel Goldstein
? Типичный C, казалось бы
очередь с приоритетами как коллекция отличается от сортированного (мульти)множества не просто так
источник

CD

Constantine Drozdov in rust_offtopic
Emmanuel Goldstein
? Типичный C, казалось бы
тут особо поражает знакомство автора с темой

Те самые операции с битовыми массивами, что отдельно упоминались выше, реализованы с использованием авто указателя unique_ptr, для которого память выделяется с помощью new[]. Вспомним, что данный оператор выражение (не путать с операцией new!) внутри обращается к C-шному malloc соответствующей операции new[], а затем инициализирует каждый объект в созданном массиве через default initialize который в этом случае означает do nothing но я не в курсе
источник

SE

Stanislav Ershov in rust_offtopic
Constantine Drozdov
тут особо поражает знакомство автора с темой

Те самые операции с битовыми массивами, что отдельно упоминались выше, реализованы с использованием авто указателя unique_ptr, для которого память выделяется с помощью new[]. Вспомним, что данный оператор выражение (не путать с операцией new!) внутри обращается к C-шному malloc соответствующей операции new[], а затем инициализирует каждый объект в созданном массиве через default initialize который в этом случае означает do nothing но я не в курсе
да там с этими тестами какой то треш и угар вечно, посомтреть достаточно тот известный с тестами разных языков
источник

SE

Stanislav Ershov in rust_offtopic
да блин половина на С++ написано мякго говоря ужасно
источник

CD

Constantine Drozdov in rust_offtopic
Stanislav Ershov
да там с этими тестами какой то треш и угар вечно, посомтреть достаточно тот известный с тестами разных языков
Ну практическое сравнение сишки и плюсов непрофессионалами совершенно бредово. Можно обсуждать, что таблицы виртуальных функций или исключения там не zero-cost, с другой стороны сишка несколько ужасна и прекрасна в копипасте. Обычно примеры нормального кода - исключительно вопрос, где у нас продолбался оптимизатор и куда send feedback
источник

KR

Kai Ren in rust_offtopic
Emmanuel Goldstein
Я продолжаю размышлять над своей идеей про систему типов, которая на самом деле просто пачка const fn
Кажется, это позволяет реализовывать достаточно сложные фичи почти бесплатно
Она не даёт бесплатно зависимые типы и линейные/афинные/релевантные типы, но HKT, GAT, специализация идут бесплатно
Трейт — это просто функция
my_trait :: (Type, ...) -> Maybe (Type, ...)

(где (Type, ...) это «tuple из некоего количества элементов типа Type»)
Если трейт возвращает Just ..., то он реализован и внутренности Just — ассоциированные типы
Если Nothing, то трейт не реализован
При компиляции вместо сложной магии настоящих тайпчекеров, мы просто вызываем функцию и смотрим, что она вернёт
Специализация — это просто if внутри функции
Дженерик-типы — это функция, которая принимает тип и возвращает тип
HKT — это просто частично применённый дженерик-тип (и мы даже можем делать разные лейауты для разных аргументов дженерика, простым ифом)

У меня, правда, ощущение, что вывод типов это ломает напрочь, кроме самых тривиальных случаев. Фиг бы с тем, что тут очевидно получается Тьюринг-полный тайпчекинг, но для рабочего вывода типов тут потребуется реверсивно исполнять Тьюринг-полную программу что эээ немного невозможно. Вывод возвращаемого типа функции будет работать нормально, но вывод типов аргументов будет сломан на уровне «проще вообще его не делать». Возможно, конечно, эту боль можно как-то уменьшить с помощью простого синтаксиса для type ascription, но всё равно неприятно.
Напомнило executing types из neut.
источник

SP

Stanislav Popov in rust_offtopic
ктонить может сделать

cargo install cargo-generate
источник