Nomad
> שָׁלוֹם
Я так и знал, что у крестонеосиляторов кончатся аргументы.
0iStalker
> Во флейме?! 0_o
Ну а сейчас слишком софткорно, ощущения не те.
Шёл 2017 год. Крестовики по-прежнему боролись с printf:
Panzerschrek[CN]
> Шёл 2017 год. Крестовики по-прежнему боролись с printf:
И до сих пор никто не поборол
Долго же я читал эту тему. Вот реализация leftpad с использованием моей библиотеки Intra:
String LeftPad(StringView s, size_t n, char fill=' ') { return Drop( Range::Repeat( fill, n), s.Length( )) + s; }
Range::Repeat создаёт диапазон, котрый ведёт себя как массив из n элементов, равных fill, всё это происходит без выделения памяти.
Drop удаляет из него до указанного количества символов, но не больше, чем есть.
Оператор + принимает любые два диапазона символов и конкатенирует их в String за одну аллокацию.
При этом благодаря StringView, функция принимает строки любого вида, представляющие собой массив char - это может быть Си-строка, std::string, мой String, std::vector<char>, std::array<char, N>. Добавив немного шаблонной магии, можно заставить эту функцию принимать вообще любые диапазоны, потоки и контейнеры, включая текстовые файлы и связные списки символов.
Кстати, если результирующая строка не длиннее 11 байт на 32-битной платформе или 23 на 64-битной, то вообще всё делается без аллокаций. При этом никаких накладных расходов на буфер на стеке sizeof(String) == 12 и 24 соответственно.
gammaker
> return Drop(Range::Repeat(fill, n), s.Length()) + s;
s.Length() - тут точно верно применен?
p.s. и почему Drop, а не Trunc? :)
Vitorio
> s.Length() - тут точно верно применен?
С чего бы ему не быть верно применённым? Максимальный паддинг достигается, когда строка пустая, уменьшается с длиной строки и отсутствует, когда она не короче, чем n.
Vitorio
> p.s. и почему Drop, а не Trunc? :)
Я использовал терминологию диапазонов языка D. Там так называлось. Да и в функциональных языках, насколько я знаю, такая терминология.
Кстати, Drop выкидывает первые элементы, а не последние. В данном примере это неважно, но важно для диапазонов, которые могут не знать своей длины или быть бесконечными.
gammaker
Все понял. Теперь дошло как работает Drop. Спасибо!
Всю тему запороли скучным спором про арабский(
И чего, больше никто не прокомментирует мой leftpad? Столько было реализаций, а у меня самое короткое и эффективное решение. Ну если конечно не тащить мою либу только ради него. И оно демонстрирует мощь, универсальность и в то же время эффективность диапазонов в моей либе.
Я в последнее время всё больше пишу на JS, который тут обсуждали, и даже там нет такой выразительности. Часто приходится писать циклы там, где можно было бы обойтись одной строкой в C++/Intra. А библиотеку для JS писать не вариант, потому что там нет zero cost abstraction. Придётся платить её размером и производительностью.
Я считаю, что нужно всего два языка - C++ (или лучше D когда/если дорастёт) для того, что требует высокой производительности и JS для веба и других не критичных к производительности вещей, где нативный JSON и динамическая типизация будет удобной. Конечно у этих языков должны быть такие же удобные библиотеки, как у языков-конкурентов, причём образующие единую экосистему, а не помойку слабосвязанных библиотек с дублирующимся базовым функционалом.
Я вот недавно изучал Java, и так и не понял, зачем она нужна. Из-за отсутствия value типов и нормальных generic'ов она жрёт в разы больше памяти на ровном месте, без причины. Кода на ней нужно писать дофига, я как-то не заметил прироста продуктивности по сравнению с плюсами. Единственные плюсы в плане скорости разработки - это автоматическое подтягивание зависимостей, сборщик мусора и наличие обширной стандартной библиотеки, и других библиотек, написанных в том же едином стиле и хорошо сочетающихся со стандартными. Что мешает написать такое же в C++ и D?
gammaker
> Я вот недавно изучал Java, и так и не понял, зачем она нужна.
Это диагноз, батенька :)
gammaker
к подобным умозаключениям пришел, щас во всю тестирую связку qt c++ вместе с qml js. Причем qt дает весь механизм связки с++ и js, QMap отлично превращается сама в QVariant, который легко передается в JS переменную, где из обычного объекта читаешь property, которые были сделаны из ключ-значения мапы. А если учесть, что сама мапа из вариант типа, то спокойно делаются сложные JS объекты, чем я и пользуюсь. Плюс декларативный синтаксис QML объектов идеально подходит для GUI. Может под новый год, скину сылку на свой github покидать какашками свой проек-пример, главное успеть доделать его.
Не подумайте что я того, но лучше бы в C++ добавили возможность программировать на GPU и для GPU (и NVidia, и AMD Radeon).
gammaker
> Кода на ней нужно писать дофига,
Да? Можно примеры в студию ?
capitalknew
> Не подумайте что я того, но лучше бы в C++ добавили возможность программировать
> на GPU и для GPU (и NVidia, и AMD Radeon).
CUDA
Тема в архиве.