Блог*
Ir al canal en Telegram
Блог со звёздочкой. Много репостов, немножко программирования. Небольшое прикольное комьюнити: @decltype_chat_ptr_t Автор: @insert_reference_here
Mostrar más1 993
Suscriptores
-124 horas
+77 días
+1330 días
Archivo de publicaciones
1 991
#prog #ml #cpp #article
Ревью вайб-кода с гнильцой, который притворяется оптимизированным С++ кодом
(от Андрея Карпова, который глава PVS-Studio)
1 991
Раньше: "Если все пойдут с гаражей прыгать, ты тоже пойдёшь?"
Сейчас: "Если все пойдут вайбкодить, ты тоже пойдёшь?"
1 991
#prog #article
Exceptions in Cranelift and Wasmtime
И немного о том, почему добавить поддержку исключений в уже существующий WASM-рантайм оказалось не самой тривиальной задачей
1 991
Repost from Neural Machine
Я хочу быть максимально удовлетворен своей жизнью. Если окажется херня, я поделюсь, как этого добился.
1 991
#prog #rust #rustreleasenotes
Вышла версия Rust 1.95.0! Как всегда, тут только выдержки, всё остальное в детальных заметках о релизе.
▪️
if-гуарды на ветках match теперь могут использовать if let:
match value {
Some(x) if let Ok(y) = compute(x) => {
// Both `x` and `y` are available here
println!("{}, {}", x, y);
}
_ => {}
}
▪️Частично примыкающее изменение: компилятор больше не выдаёт предупреждение на безусловные паттерны в if let. Автор изменения мотивирует это распространением кода навроде такого:
fn main() {
if let x = funx() && x < usize::MAX {
// use x
}
}
Эта идиома позволяет привязать значение и что-то сделать/проверить с ним и при этом не пустить имя в окружающую область видимости.
▪️Добавили новый макрос cfg_select!, который позволяет сделать подобие match, но для cfg-предикатов:
cfg_select! {
unix => {
fn foo() { /* unix specific functionality */ }
}
target_pointer_width = "32" => {
fn foo() { /* non-unix, 32-bit functionality */ }
}
_ => {
fn foo() { /* fallback implementation */ }
}
}
let is_windows_str = cfg_select! {
windows => "windows",
_ => "not windows",
};
Технически этот макрос не даёт новых возможностей, но без него нужные атрибуты #[cfg] нужно выписывать самостоятельно, дублируя дословно все предикаты. Ровно по этой причине стал распространён и используется cfg-if — собственно, объявление в блоге напрямую на него и ссылается.
▪️Навряд ли кого-то коснётся, но: match по enum теперь всегда ведёт себя так, как будто он читает дискриминант. Это кажется странным, но объясняется #[non_exhaustive]. Без этого изменения то, есть ли в некотором unsafe-коде UB или нет, зависело от того, определён ли enum в текущем крейте или в другом. Также match теперь читает дискриминант, даже если только одна ветка населена — без этого изменения поведение различалось в обобщённом коде и в ручной мономорфизации.
▪️Поддержку части платформ подняли до Tier 2 — в основном встраиваемые ARM-платформы от Apple (и их симуляторные версии).
▪️Стабилизированы несколько API, в частности:
🔸Конверсии по ссылке из MaybeUninit-массивов в массивы и слайсы из MaybeUninit, а также конверсии по значению между ними
🔸Аналогичные конверсии по ссылке между массивами в Cell и массивами из Cell
🔸Модуль core::range, в котором собираются диапазоны, планируемые на замену текущим. Пока что стабилизированы только RangeInclusive и его итератор. В отличие от текущих диапазонов, новый тип не служит одновременно итератором и потому реализует Copy (при Copy-индексах, разумеется) и занимает меньше места: ему не нужно хранить состояние для отслеживания поведения на последней итерации, только два индекса.
🔸Функция core::hint::cold_path для пометки пути исполнения, который не предполагается, что будет часто исполняться. Этакая замена likely/unlikely.
▪️rustdoc теперь предпочитает стабильные определения нестабильным при сортировке результатов поиска.