Forwarded from XYZ
25 марта в Steam выходит головоломка Dorfromantik от берлинской инди-студии Toukana Interactive. Геймплей простой и медитативный — нужно собирать уютный городок, правильно выбирая места для построек.
Отлично подойдёт для тех, кто давно мечтал о Каркассоне без противников.
Отлично подойдёт для тех, кто давно мечтал о Каркассоне без противников.
Forwarded from dd if=/dev/stuff of=/dev/tg
Алексис Кинг написала большую и очень классную статью про тайплевел-программирование на хаскеле:
https://lexi-lambda.github.io/blog/2021/03/25/an-introduction-to-typeclass-metaprogramming/
https://lexi-lambda.github.io/blog/2021/03/25/an-introduction-to-typeclass-metaprogramming/
#prog #rust #rustreleasenotes
Вышла версия Rust 1.51! Как обычно, я не буду перечислять всё, а отмечу только то, что интересно лично мне.
Невозможно не отметить самую важную фичу релиза: const generics 🎉! К сожалению, это всё ещё не полная версия, а стабилизация
Кстати, о массивах: этот релиз добавляет std::array::IntoIter, итератор для массивов, возвращающий элементы по значению. До этого релиза для того, чтобы вернуть итератор, возвращающий ряд некоторых значений, было несколько опций, каждая из которых малость попахивала: вызывать
Cargo сделали чуток умнее: теперь резолвер фичей, если отдельно включить новую версию, не слепляет бездумно все фичи для каждой из зависимостей в одну (возрадуйся, @ihatereality!). В блогпосте есть примеры того, как старое поведение на практике ломало код. Это изменение позволило закрыть разом семь issue!
В Rust до этого релиза не было возможности получить по указателю на структуру указатель на её поле, не создавая промежуточную ссылку на поле. Одна из причин, почему это так сильно мешалось на практике — это отсутствие в Rust аналога offsetof из C. Существующий для этого крейт страдал от того факта, что для получений этого смещения брал ссылку на неинициализированные данные, что технически является неопределённым поведением. С добавлением макросов ptr::addr_of/ptr::addr_of_mut, которые позволяют брать адрес в виде сырого указателя без создания промежуточной ссылки, эта проблема уходит.
Одна из достаточно обоснованных претензий к Rust состоит в том, что из-за deref coercion часто неочевидно, какими методами обладает тип. Начиная с этого релиза,
Вышла версия Rust 1.51! Как обычно, я не буду перечислять всё, а отмечу только то, что интересно лично мне.
Невозможно не отметить самую важную фичу релиза: const generics 🎉! К сожалению, это всё ещё не полная версия, а стабилизация
min_const_generics
, то есть версия с серьёзными ограничениями, о которых можно подробнее почитать отдельно. Одни из них вполне понятны — это ограничения на использование выражений с использованием таких параметров — что вполне логично, поскольку в общем случае их унификация является достаточно сложной задачей, а вот ограничения на типы самих константых обобщённых параметров куда более обидны: использовать пока что можно лишь примитивные числовые типы, char
и bool
. С другой стороны, одной из главных причин стабилизации const generics была необходимость в возможности писать код, полиморфный по массивам произвольной размерности (что ранее решалось лишь частично при помощи копипаста, разбавленного макросами), и эту задачу нынешний вариант const generics решает.Кстати, о массивах: этот релиз добавляет std::array::IntoIter, итератор для массивов, возвращающий элементы по значению. До этого релиза для того, чтобы вернуть итератор, возвращающий ряд некоторых значений, было несколько опций, каждая из которых малость попахивала: вызывать
.into_iter()
на векторе (и делать аллокацию там, где она не нужна), вызывать .iter().cloned()
/.iter().copied()
на литерале массива (что делает лишнее копирование, которое в некоторых случаях невозможно вовсе) или же .chain(...)-ить once-ы (что выглядит громоздко и, более того, достаточно медленно работает). Теперь же есть нормальные рабочий вариант. Почему же не добавили impl Intoiterator for [T; N]
, спросите вы? К сожалению, есть странные люди, которые вызывают .into_iter()
на литералах массива, который ввиду авто-борровинга вызывает <&[T]>::into_iter
, что, в принципе, аналогично вызову .iter()
. Добавление реализации IntoIterator
для массивов технически сломало бы этот код. Не исключено, что в будущем на этот шаг всё-таки пойдут, и array::IntoIter::new
останется на свалке истории.Cargo сделали чуток умнее: теперь резолвер фичей, если отдельно включить новую версию, не слепляет бездумно все фичи для каждой из зависимостей в одну (возрадуйся, @ihatereality!). В блогпосте есть примеры того, как старое поведение на практике ломало код. Это изменение позволило закрыть разом семь issue!
В Rust до этого релиза не было возможности получить по указателю на структуру указатель на её поле, не создавая промежуточную ссылку на поле. Одна из причин, почему это так сильно мешалось на практике — это отсутствие в Rust аналога offsetof из C. Существующий для этого крейт страдал от того факта, что для получений этого смещения брал ссылку на неинициализированные данные, что технически является неопределённым поведением. С добавлением макросов ptr::addr_of/ptr::addr_of_mut, которые позволяют брать адрес в виде сырого указателя без создания промежуточной ссылки, эта проблема уходит.
Одна из достаточно обоснованных претензий к Rust состоит в том, что из-за deref coercion часто неочевидно, какими методами обладает тип. Начиная с этого релиза,
cargo doc
добавляет в документацию методы, полученные при помощи deref coercion произвольной глубины применения. До этого изменения, если у нас были типы A
, B
и C
с реализациями impl Deref<Target = B> for A
и impl Deref<Target = C> for B
, то документация к A
показывала методы A
и B
, но не C
. Теперь же будут видны и методы C
.Ну и из мелочей:
* теперь можно запустить вообще все тесты, используя
* intra-doc-ссылки теперь могут ссылаться на примитивы, ассоциированные элементы (методы, типы, константы) и обобщённые параметры.
* добавлены методы
* добавлен метод
* теперь можно запустить вообще все тесты, используя
cargo test -- --include-ignored
. До этого можно было запустить либо основные тесты, либо игнорируемые, но не оба набора сразу.* intra-doc-ссылки теперь могут ссылаться на примитивы, ассоциированные элементы (методы, типы, константы) и обобщённые параметры.
* добавлены методы
std::iter::Peekable::
{next_if, next_if_eq}, которые возвращают следующий элемент только в том случае, если он удовлетворяет предикату/равен переданному значению. Невероятно полезная вещь при написании парсеров.* добавлен метод
str::
split_inclusive, который разбивает строку на подстроки по разделителю, включая сам разделитель в подстроки (возрадуйся, @rustamann!). Аналогичные методы добавлены для слайсов (split_inclusive/split_inclusive_mut)GitHub
stabilise `cargo test -- --include-ignored` by gilescope · Pull Request #80053 · rust-lang/rust
stabilise cargo test -- --include-ignored
On stable there's no way to run ignored tests as well as the normal tests.
An example use case where stabilising this would help:
Exercism has some...
On stable there's no way to run ignored tests as well as the normal tests.
An example use case where stabilising this would help:
Exercism has some...
Forwarded from Julia Lang
[a, b, c, d, e, f ..] ⇔ map read $ unsafePerformIO $ httpRequest $ “https://oeis.org/search?q=“ ++ (intercalate “,” $ map show [a, b, c, d, e, f])
#prog #rust #rustasync #article
Новая статья Амоса о пристальном взгляде на async в Rust. Чисто с точки зрения человека, который впервые с этим столкнулся, без сильного погружения в тонкости реализации async
(thanks @tapok_satan)
Новая статья Амоса о пристальном взгляде на async в Rust. Чисто с точки зрения человека, который впервые с этим столкнулся, без сильного погружения в тонкости реализации async
(thanks @tapok_satan)
fasterthanli.me
Pin and suffering
I ’ d like to think that my understanding of “ async Rust ” has increased over the past year or so. I ’ m 100% onboard with the basic principle: I would like to handle thousands of concurrent tasks...
#prog #rust #rustlib
Замыкания в Rust могут работать в двух режимах: без ключевого слова
В C++ у лямбда-функций есть отдельные списки захвата переменных, поэтому там эта задача решается достаточно просто. Синтаксис Rust не предлагает прямолинейного способа решения этой проблемы. Единственный вариант — это вручную ввести новые привязки к ссылкам на нужные значения и "передать" их в
К счастью, для сокращения бойлерплейта в Rust есть макросы! И есть библиотека, которая фактически привносит список захвата для лямбд: https://lib.rs/crates/closure
Замыкания в Rust могут работать в двух режимах: без ключевого слова
move
они захватывают значения по ссылке (разделяемой или уникальной — в зависимости от использования), а с ключевым словом move
они захватывают все значения по значению. Как правило, этого достаточно, но иногда требуется часть значений захватить по значению, а часть — по ссылке.В C++ у лямбда-функций есть отдельные списки захвата переменных, поэтому там эта задача решается достаточно просто. Синтаксис Rust не предлагает прямолинейного способа решения этой проблемы. Единственный вариант — это вручную ввести новые привязки к ссылкам на нужные значения и "передать" их в
move
-замыкание. Это вариант рабочий, но утомительный.К счастью, для сокращения бойлерплейта в Rust есть макросы! И есть библиотека, которая фактически привносит список захвата для лямбд: https://lib.rs/crates/closure
Lib.rs
closure — Rust library
A macro for capturing variables on a per variable basis
#prog
Данила рассказывает, почему при написании SIMD-кода имеет смысл держать версии не только на AVX, но и на SSE.
t.iss.one/experimentalchill/87
Данила рассказывает, почему при написании SIMD-кода имеет смысл держать версии не только на AVX, но и на SSE.
t.iss.one/experimentalchill/87
Telegram
Experimental chill
Когда я оптимизировал многие вещи с помощью SIMD инструкций, всегда вставал вопрос о том, почему версии с AVX (как SSE, только операции с регистрами по 256 бит вместо 128) не так уж и классно работают. Тогда я узнал о такой вещи, как CPU downclocking: процессоры…
#prog #amazingopensource
autoperf simplifies the instrumentation of programs with performance counters on Intel machines. Rather than trying to learn how to measure every event and manually programming event values in counter registers or perf, you can use autoperf which will repeatedly run your program until it has measured every single performance event on your machine. autoperf tries to compute a schedule that maximizes the amount of events measured per run, and minimizes the total number of runs while avoiding multiplexing of events on counters.
(thanks @folexeyy)
autoperf simplifies the instrumentation of programs with performance counters on Intel machines. Rather than trying to learn how to measure every event and manually programming event values in counter registers or perf, you can use autoperf which will repeatedly run your program until it has measured every single performance event on your machine. autoperf tries to compute a schedule that maximizes the amount of events measured per run, and minimizes the total number of runs while avoiding multiplexing of events on counters.
(thanks @folexeyy)
GitHub
GitHub - gz/autoperf: Simplify the use of performance counters.
Simplify the use of performance counters. Contribute to gz/autoperf development by creating an account on GitHub.
Сначала всё было плохо.
Потом пришли растоманы и сделали ещё хуже.
Зато на расте.
Потом пришли растоманы и сделали ещё хуже.
Зато на расте.
🤡2