очень давно не выходил из дома. Но посмотрев на чертежи двс с этими всеми жуткими патрубками в автокаде, понимаю, что лошадиная повозка превратилась во что-то другое, не приспособленное для человечьих мозгов.
Верните обратно телегу ;)
Хотя лично я болею за Дилижанс и надеюсь, что при смене поколений этот "монстрик" уйдет туда-же куда ушла палка копалка с неандертальцами.
И да в portfile по ссылке никакой "чудовищной сложности" нету. Думаю в конфигурации правильных асм листингов под зоопарк платформ и работы с сетью (да в опенссл есть сеть) сложности больше
Так vcpkg это аналог pkgbuild из арча, deb скриптов и подобного. Т.е. тут обертка вокруг ./configure && make install а не переписываниею autotools, perl и прочего на симейк. Обертку сделать в разы проще чем портировать миллион скриптов на симейк. И вообще если там требуется действительно что то сложное заскриптовать, то симейк как язык по сравнению с перлом это убожество.
Вредительство это сам виндовс и его поддержка. Чтобы его поддерживать требуется портить код. Он постоянно падает в BSOD, не поддерживает правильное поведение и сохраняет баги в поведении, отказываясь его фиксить Если компания разрешает только виндовс - это её проблемы. Linux опенсорс в отличие от закрытого виндовс, поддерживает С++ лучше, программы работают обычно на 30%+ быстрее
ой, кстати, да, как реализовать рейндж всех нечётных интов одним iota, без фильтра?
можно cделать трансформ из n в 2*n + 1
а то вы так долго напирали, что у меня немощно и плохо всё
так вы повоторите хоть то что в iota есть. Если бесконечный ренж неподдерживается то ладно, я вроде такое не просил.
Только в очередной раз не сделали их размер определяется наличием имени,
там проблема наверное в том что старые итераторы в уже существующем коде хотели продолжать поддерживать, в новом коде iterator_category определяется.
Хоспаде, ну наконец-то!
Я ничего сложного не просил. Просто есть вектор vec, r1 = vec | transform(f) известен размер и есть доступ к элементам, r2 = vec | filter(g) тут размера нету есть только forward итератор. Есть например
auto foo(range auto r) { return r | transform(h); }
Сохраняются свойства и при передаче r1 и r2, удобно.
На уровне реализации во всех этих рефах хранится указатель, поэтому атомарность бесплатная.
Если передаётся рефы всё равно вопрос как их менять. Либо копировать, либо менять инплейс.
В раст я не понял как этим пользоваться. Из статьи и кода бенчмарка непонятно. Как будет индексироваться Vector3<f32x4>, индексами от 0 до 3 или от 0 до 12?
Это ForeignPtr. GC знает, что и как финализировать.
Ок, получается имплементировать эту часть на языке не надо т.к. она встроена в язык. В джава или C# я такой штуки не знаю (но может есть).
Так за iota и рандомного доступа нет, поди пойми, что вам надо.
Для чисел есть
Зачем сюда Range? У нас тут отдельная ветвь дискуссии, где мы обсуждаем голые функции.
Вы почему-то продолжаете делать вид что не понимаете разницу между контейнерами, функциями и ренжами.
А если у меня там будет pair<width, height> size()?
Никто не запрещает в С++ делать именованные маркеры. А так да, подходы разные, и это уже другая тема. В расте с трейтами аналогичную проблему всё же как-то решают.
Ненене, вы саму zip_transform напишите. На плюсах же с шаблонами всё просто, так что как это будет выглядеть?
zip_transform принимает сколько угодно ренжей, жду для начала вариадиков в хаскеле.
а оно не sized_range
Это недоработка реализации. Бесконечный размер на уровне типов приравнен к неизвестному размеру. Ваш пример с zip кстати как раз неизвестный размер тоже не покрыл.
Если игнорировать нюансы со ссылками то можно повторить ваш искуственный пример как-то так
template<typename F>
struct Unbounded {
F f;
};
template<typename F>
struct Bounded {
F f;
size_t len;
};
template<typename T>
concept HasLen = requires(T x) {
x.len;
};
auto zipWith(auto f, HasLen auto a, HasLen auto b) {
return Bounded([=](size_t i) { return f(a.f(i), b.f(i)); }, std::min(a.len, b.len));
}
auto zipWith(auto f, HasLen auto a, auto b) {
return Bounded([=](size_t i) { return f(a.f(i), b.f(i)); }, a.len);
}
auto zipWith(auto f, auto a, HasLen auto b) {
return Bounded([=](size_t i) { return f(a.f(i), b.f(i)); }, b.len);
}
auto zipWith(auto f, auto a, auto b) {
return Unbounded([=](size_t i) { return f(a.f(i), b.f(i)); });
}
Так делать не надо потому что это не реализует нужных концептов для итераторов/ренжей.
Хотя я пока писал понял что смысла в таком Unbounded нету совсем. У нас либо рандом аксесс и тогда мы знаем границы, либо не знаем границ и достаём по-одному. Получается бестолковый пример обсуждаем :/
Мутируете, делаете freeze, кладёте в TVar или что-то подобное, в другой транзакции достаёте, делаете thaw, мутируете.
сложность thaw O(n), т.е. оно делает копию. Вообще продолажая тему про IORef я не понял как там атомарно поменять что-то размером больше инта.
В сложных примерах я не замечу, что два раза читаю из IORef
Если есть гарантия что владение переменной однопоточное, то в чём проблема?
Если можете как человек гарантировать, что это безопасно,
Посыл нашего обсуждения что гарантировать должен компилятор, а не человек.
запилят поддержку линейных типов.
Поэтому раст тут получается впереди, о чём изначально и говорилось по ссылке. Борроу чекер в паре с send/sync даёт больше выразлительности.
очень давно не выходил из дома. Но посмотрев на чертежи двс с этими всеми жуткими патрубками в автокаде, понимаю, что лошадиная повозка превратилась во что-то другое, не приспособленное для человечьих мозгов.
Верните обратно телегу ;)
Хотя лично я болею за Дилижанс и надеюсь, что при смене поколений этот "монстрик" уйдет туда-же куда ушла палка копалка с неандертальцами.
Речь же про Си, там даже если выкинуть мсвц, найдутся другте компиляторы. Не знаю что опенссл поддерживает если честно
Вижу вы так и не поняли что вам хотел сказать @Kelbon
Фиговые дефолты это проблема многих долгоживущих проектов. Проблема мсвц что и после напарываешься на баги, а не четыре флага в симейке
даже если предположить что что-то пофиксят, то сколько еще ждать пока потенциальные пользователи обновлять компилятор?
Так об универсальном стандарт-онли решении говорили вы, и привели пример с гну расширением.
самое ли это популярное среди спонсоров опенссл?
И да в portfile по ссылке никакой "чудовищной сложности" нету. Думаю в конфигурации правильных асм листингов под зоопарк платформ и работы с сетью (да в опенссл есть сеть) сложности больше
Так vcpkg это аналог pkgbuild из арча, deb скриптов и подобного. Т.е. тут обертка вокруг ./configure && make install а не переписываниею autotools, perl и прочего на симейк.
Обертку сделать в разы проще чем портировать миллион скриптов на симейк. И вообще если там требуется действительно что то сложное заскриптовать, то симейк как язык по сравнению с перлом это убожество.
Вредительство это сам виндовс и его поддержка. Чтобы его поддерживать требуется портить код. Он постоянно падает в BSOD, не поддерживает правильное поведение и сохраняет баги в поведении, отказываясь его фиксить
Если компания разрешает только виндовс - это её проблемы. Linux опенсорс в отличие от закрытого виндовс, поддерживает С++ лучше, программы работают обычно на 30%+ быстрее
[[gnu::noinline]]и как это будет работать по мсвц? Из-за поддержки зоопарка компиляторов оно всё и усложняетсяТак вот где находится gut feeling
Эту статью писал ллм
"Btw I use arch"
Мало кто знает что "r" в scrum не читается
можно cделать трансформ из n в 2*n + 1
так вы повоторите хоть то что в iota есть. Если бесконечный ренж неподдерживается то ладно, я вроде такое не просил.
там проблема наверное в том что старые итераторы в уже существующем коде хотели продолжать поддерживать, в новом коде iterator_category определяется.
Я ничего сложного не просил. Просто есть вектор vec,
r1 = vec | transform(f)известен размер и есть доступ к элементам,r2 = vec | filter(g)тут размера нету есть только forward итератор. Есть напримерСохраняются свойства и при передаче r1 и r2, удобно.
Если передаётся рефы всё равно вопрос как их менять. Либо копировать, либо менять инплейс.
Я не вижу как одна фича противоречит другой.
В раст я не понял как этим пользоваться. Из статьи и кода бенчмарка непонятно. Как будет индексироваться
Vector3<f32x4>, индексами от 0 до 3 или от 0 до 12?Апд исправил форматирвание
Мне лень участвовать в демагогии что конструктивно а что нет.
Фичей eigen в nalgebra нету потому что их невозможно реализовать на расте.
Ок, получается имплементировать эту часть на языке не надо т.к. она встроена в язык. В джава или C# я такой штуки не знаю (но может есть).
Для чисел есть
Вы почему-то продолжаете делать вид что не понимаете разницу между контейнерами, функциями и ренжами.
Никто не запрещает в С++ делать именованные маркеры. А так да, подходы разные, и это уже другая тема. В расте с трейтами аналогичную проблему всё же как-то решают.
zip_transformпринимает сколько угодно ренжей, жду для начала вариадиков в хаскеле.Это недоработка реализации. Бесконечный размер на уровне типов приравнен к неизвестному размеру. Ваш пример с zip кстати как раз неизвестный размер тоже не покрыл.
Если игнорировать нюансы со ссылками то можно повторить ваш искуственный пример как-то так
Так делать не надо потому что это не реализует нужных концептов для итераторов/ренжей.
Хотя я пока писал понял что смысла в таком Unbounded нету совсем. У нас либо рандом аксесс и тогда мы знаем границы, либо не знаем границ и достаём по-одному. Получается бестолковый пример обсуждаем :/
сложность thaw O(n), т.е. оно делает копию. Вообще продолажая тему про IORef я не понял как там атомарно поменять что-то размером больше инта.
Если есть гарантия что владение переменной однопоточное, то в чём проблема?
Посыл нашего обсуждения что гарантировать должен компилятор, а не человек.
Поэтому раст тут получается впереди, о чём изначально и говорилось по ссылке. Борроу чекер в паре с send/sync даёт больше выразлительности.
В чем неконструктивность если я просто констатирую факты?
А так да, будем ждать ¯_(ツ)_/¯