Forwarded from Linker Unsafe
Увидено в раст-мейне, кмк довольно ценый список.
https://github.com/danistefanovic/build-your-own-x
https://github.com/danistefanovic/build-your-own-x
GitHub
GitHub - codecrafters-io/build-your-own-x: Master programming by recreating your favorite technologies from scratch.
Master programming by recreating your favorite technologies from scratch. - codecrafters-io/build-your-own-x
#prog #cpp #article
C++20: удивить линкер четырьмя строчками кода — или сказ о том, как код студента вскрыл ошибку в компиляторе.
C++20: удивить линкер четырьмя строчками кода — или сказ о том, как код студента вскрыл ошибку в компиляторе.
Хабр
C++20: удивить линкер четырьмя строчками кода
Представьте себе, что вы студент, изучающий современные фичи C++. И вам дали задачу по теме concepts/constraints. У преподавателя, конечно, есть референсное реше...
Forwarded from Why Typescript is bad (Abu)
Forwarded from XYZ
Рассказываем всё, что вы хотели узнать об автомобильных трюках в кино — от Чарли Чаплина до «Форсажей».
Как режиссёры используют практические и компьютерные эффекты для сцен с машинами, как готовят локации, и почему монтаж — самый важный этап для съёмки погони.
Как режиссёры используют практические и компьютерные эффекты для сцен с машинами, как готовят локации, и почему монтаж — самый важный этап для съёмки погони.
#prog #rust
Пост на реддите про запрос на крейты с особенно хорошим кодом. Ну и ответами, разумеется.
(thanks @ozkriff)
Пост на реддите про запрос на крейты с особенно хорошим кодом. Ну и ответами, разумеется.
(thanks @ozkriff)
reddit
What are some examples of particularly well written crates?
Looking for inspiration and some things to refer back to when I'm not sure what the professional way of doing something is. I'm especially...
#prog #rust
Документация rustc, рассказывающая о том, как компилятор проверяет, что в
Документация rustc, рассказывающая о том, как компилятор проверяет, что в
match
нет недостижимых ветвей и как он проверяет, что в match
рассмотрены все возможные варианты (спойлер: вторая задача сводится к первой путём добавления _
).doc.rust-lang.org
rustc_mir_build::thir::pattern::usefulness - Rust
Note: tests specific to this file can be found in:
Кстати: технически в Rust нет сущностей без обобщённых параметров, а есть лишь сущности с нулевым количеством обобщённых параметров. Во всяком случае, пустую турборыбу (
::<>
) можно воткнуть практически везде:fn fishy() {
assert_eq!(String::from("><>"),
String::<>::from::<>("><>").chars::<>().rev::<>().collect::<String>());
}
#prog #rust #rustreleasenotes
Да, да, я знаю, что я лениваяжягодица, не напоминайте.
Вышел Rust 1.53.0! Как обычно, я не буду разбирать релиз целиком, а выделю лишь то, что привлекло лично моё внимание.
Но начну я, пожалуй, с парочки вещей, которые мне особенно примечательны по личным причинам. Как я уже рассказывал, я реализовал индексацию слайсов при помощи пар std::ops::Bound, и в этой версии моя реализация наконец докатилась до стабильной версии Rust. Очень приятно видеть изменение в release notes и осознавать, что ты непосредственно приложил руку к тому, чтобы этот пункт появился. Ещё одно примечательное изменение — это стабилизация Vec::extend_from_within, реализованного замечательным @WaffleLapkin. Жму руку, коллега!
Перейдём теперь к изменениям в языке. Самое, пожалуй, крутое — это то, что или-паттерны теперь могут быть вложенными (пример беззастенчиво стырю из блога):
Ещё одна не менее заметная вещь — теперь можно итерироваться напрямую по массивам, то есть наконец-то можно писать
А теперь перейдём к полезным плюшкам из стандартной библиотеки.
То, что, пожалуй, затронет почти всех — это то, что для чисел с плавающей точкой теперь реализованы парсинг и печать специальных значений в соответствии с тем, как того требует стандарт IEEE 754. Наиболее заметное изменение — это то, что теперь негативный ноль всегда печатается со знаком минус. На этом уже обожглись авторы различных численных библиотек.
В модуль
До сих пор я старательно обходил стороной слона в комнате, но теперь придётся представить и его: в Rust теперь можно писать идентификаторы из не ASCII символов. Честно, у меня с этого горит. Никакой реальной нужды в этом нет, в tracking issue всё ещё висит вопрос насчёт RTL, и само наличие этой фичи открывает возможность написания проектов, фактически, не на английском языке, что резко увеличивает порог входа внешних контрибуторов и потому вообще-то идёт вразрез с декларируемыми ценностями Rust-сообщества. Как и ожидалось, пропихнул это Центрил, который уже известен своими по меньшей мере сомнительными предложениями.
С другой стороны, когда Rust только вышел, хейтеры говорили, что все проекты поголовно будут в unsafe — и эти чаянья вы итоге не оправдались. Возможно, так же будет с юникодными идентификаторами, поживём — увидим.
Но у меня все ещё горит.
Да, да, я знаю, что я ленивая
Вышел Rust 1.53.0! Как обычно, я не буду разбирать релиз целиком, а выделю лишь то, что привлекло лично моё внимание.
Но начну я, пожалуй, с парочки вещей, которые мне особенно примечательны по личным причинам. Как я уже рассказывал, я реализовал индексацию слайсов при помощи пар std::ops::Bound, и в этой версии моя реализация наконец докатилась до стабильной версии Rust. Очень приятно видеть изменение в release notes и осознавать, что ты непосредственно приложил руку к тому, чтобы этот пункт появился. Ещё одно примечательное изменение — это стабилизация Vec::extend_from_within, реализованного замечательным @WaffleLapkin. Жму руку, коллега!
Перейдём теперь к изменениям в языке. Самое, пожалуй, крутое — это то, что или-паттерны теперь могут быть вложенными (пример беззастенчиво стырю из блога):
match result {
Ok(Some(1 | 2)) => { .. }
Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. }
_ => { .. }
}
Готов поспорить, через несколько релизов растоманы будут удивляться, как они раньше без этого жили (как раньше жили без pattern match ergonomics).Ещё одна не менее заметная вещь — теперь можно итерироваться напрямую по массивам, то есть наконец-то можно писать
for x in [1, 2, 3]
вместо жутко многословного array::IntoIter::new
. Но есть один нюанс: вызов .into_iter()
на массиве всё ещё возвращает итератор, возвращающий ссылки на элементы, как и раньше — и это при том, что IntoIter::into_iter(array)
работает нормально. Как и ожидалось, это поведение реализовано при помощи чудовищного костыля: трейт IntoIterator
(именно сам трейт, а не его реализация для массива) помечен специально созданным для этого атрибутом #[rustc_skip_array_during_method_dispatch]
с названием, которое говорит само за себя. И, более, этот атрибут работает (точнее, планируется) только в edition-ах ниже 2021. Хороший пример того, как обратная совместимость заставляет принимать отвратительные технические решения.А теперь перейдём к полезным плюшкам из стандартной библиотеки.
То, что, пожалуй, затронет почти всех — это то, что для чисел с плавающей точкой теперь реализованы парсинг и печать специальных значений в соответствии с тем, как того требует стандарт IEEE 754. Наиболее заметное изменение — это то, что теперь негативный ноль всегда печатается со знаком минус. На этом уже обожглись авторы различных численных библиотек.
В модуль
cmp
наконец-то добавлены функции {min, max}_by{, _key}
. Не самая часто нужная вещь, но ранее, когда она требовалось, отсутствие этого функционала вызывало недоумение.BTreeMap
и BTreeSet
получили по методу retain
, которые удаляют из коллекций элементы, которые не удовлетворяют переданному предикату. Опять-таки, отсутствие этого метода до этих самых выглядело странно с учётом того, что аналогичный метод на векторе был с самой первой версии, а у HashMap
и HashSet
— с версии 1.18.Option::insert
замещает значение в Option
и возвращает ссылку на него, и, в отличие от Option::get_or_insert
, делает это безусловно, а не только при отсутствующем значении.{integer}::BITS
у всех примитивных численных типов. Минус строчки с mem::size_of::<type>() * 8
.До сих пор я старательно обходил стороной слона в комнате, но теперь придётся представить и его: в Rust теперь можно писать идентификаторы из не ASCII символов. Честно, у меня с этого горит. Никакой реальной нужды в этом нет, в tracking issue всё ещё висит вопрос насчёт RTL, и само наличие этой фичи открывает возможность написания проектов, фактически, не на английском языке, что резко увеличивает порог входа внешних контрибуторов и потому вообще-то идёт вразрез с декларируемыми ценностями Rust-сообщества. Как и ожидалось, пропихнул это Центрил, который уже известен своими по меньшей мере сомнительными предложениями.
С другой стороны, когда Rust только вышел, хейтеры говорили, что все проекты поголовно будут в unsafe — и эти чаянья вы итоге не оправдались. Возможно, так же будет с юникодными идентификаторами, поживём — увидим.
Но у меня все ещё горит.
Forwarded from There will be no singularity
Все выпуски SQL-TIL (чтобы вы могли пошарить):
postgresql edition:
1) https://t.iss.one/nosingularity/535
2) https://t.iss.one/nosingularity/541
3) https://t.iss.one/nosingularity/548
4) https://t.iss.one/nosingularity/572
snowflake edition:
5) https://t.iss.one/nosingularity/582
6) https://t.iss.one/nosingularity/602
7) https://t.iss.one/nosingularity/753 и https://t.iss.one/nosingularity/754
8) https://t.iss.one/nosingularity/762
mix:
9) https://t.iss.one/nosingularity/755
10) https://t.iss.one/nosingularity/803 и https://t.iss.one/nosingularity/804
postgresql edition:
1) https://t.iss.one/nosingularity/535
2) https://t.iss.one/nosingularity/541
3) https://t.iss.one/nosingularity/548
4) https://t.iss.one/nosingularity/572
snowflake edition:
5) https://t.iss.one/nosingularity/582
6) https://t.iss.one/nosingularity/602
7) https://t.iss.one/nosingularity/753 и https://t.iss.one/nosingularity/754
8) https://t.iss.one/nosingularity/762
mix:
9) https://t.iss.one/nosingularity/755
10) https://t.iss.one/nosingularity/803 и https://t.iss.one/nosingularity/804
Forwarded from мне не нравится реальность (вафель 🧇🍓)
mod a {
use self::super::a::{self};
}