Можно бесконечно смотреть на три вещи: на горящий огонь, на текущую воду и на то, как WhatsApp шлёт уведомления о том, что текущая версия устарела
🔥13🖕1
#prog #rust
Начиная с версии Rust 1.66.0, реализация
Начиная с версии Rust 1.66.0, реализация
Debug для PhantomData печатает имя типа, с которым PhantomData инстанцирован:fn main() {
println!("{:?}", std::marker::PhantomData::<Vec<i32>>);
// печатает `PhantomData<alloc::vec::Vec<i32>>`
}Telegram
Блог*
#prog #rust #rustreleasenotes
Вышла версия Rust 1.66.0! Как всегда, вычленю только интересное мне, а остальное в детальных заметках о релизе.
▪️Очень важная фича для интеропа: теперь даже для enum с данными на вариантах можно использовать явные дискриминанты.…
Вышла версия Rust 1.66.0! Как всегда, вычленю только интересное мне, а остальное в детальных заметках о релизе.
▪️Очень важная фича для интеропа: теперь даже для enum с данными на вариантах можно использовать явные дискриминанты.…
👍6🤯2🖕1
#prog #rust #parsing #article
Resilient LL Parsing Tutorial
In this tutorial, I will explain a particular approach to parsing, which gracefully handles syntax errors and is thus suitable for language servers, which, by their nature, have to handle incomplete and invalid code. Explaining the problem and the solution requires somewhat less than a trivial worked example, and I want to share a couple of tricks not directly related to resilience, so the tutorial builds a full, self-contained parser, instead of explaining abstractly just the resilience.
The tutorial is denoscriptive, rather than prenoscriptive — it tells you what you can do, not what you should do.
* If you are looking into building a production grade language server, treat it as a library of ideas, not as a blueprint.
* If you want to get something working quickly, I think today the best answer is “just use Tree-sitter”, so you’d better read its docs rather than this tutorial.
* If you are building an IDE-grade parser from scratch, then techniques presented here might be directly applicable.
Resilient LL Parsing Tutorial
In this tutorial, I will explain a particular approach to parsing, which gracefully handles syntax errors and is thus suitable for language servers, which, by their nature, have to handle incomplete and invalid code. Explaining the problem and the solution requires somewhat less than a trivial worked example, and I want to share a couple of tricks not directly related to resilience, so the tutorial builds a full, self-contained parser, instead of explaining abstractly just the resilience.
The tutorial is denoscriptive, rather than prenoscriptive — it tells you what you can do, not what you should do.
* If you are looking into building a production grade language server, treat it as a library of ideas, not as a blueprint.
* If you want to get something working quickly, I think today the best answer is “just use Tree-sitter”, so you’d better read its docs rather than this tutorial.
* If you are building an IDE-grade parser from scratch, then techniques presented here might be directly applicable.
matklad.github.io
Resilient LL Parsing Tutorial
In this tutorial, I will explain a particular approach to parsing, which gracefully handles syntax errors and is thus suitable for language servers, which, by their nature, have to handle incomplete and invalid code.
Explaining the problem and the solution…
Explaining the problem and the solution…
🔥2🤔1🖕1
Блог*
#prog #rust #rustasync #article Efficient indexing with Quickwit Rust actor framework Или немного о том, почему разработчики Quickwit решили реализовать свой акторный фреймворк. Также в тексте есть ссылка на статью Actors with Tokio, которая описывает, как…
#prog #rust #rustasync
Если вы делаете что-то с акторами в Rust, может быть полезно иметь у актора возможность отправлять сообщения самому себе. К сожалению, способ в лоб — хранить отправляющую половинку канала у себя — приводит к тому, что теперь невозможно полагаться на ошибку получения из канала как на сигнал к прекращению работы актора: Sender у актора удерживает живым весь канал, и потому, если других Sender-ов нет, recv на канале навечно зависает на попытке получить из канала сообщение.
Для решения этой проблемы в tokio есть WeakSender (и WeakUnboundedSender), которые можно считать аналогом
Кстати, эта фича была добавлена по запросу, который как раз ссылается на уже упомянутую в Блог*е статью Actors with tokio. Запрос на аналогичную функциональность для каналов в std есть аж с 2016 года, но до сих пор не реализован. И в crossbeam-channel этого тоже нет, увы.
Если вы делаете что-то с акторами в Rust, может быть полезно иметь у актора возможность отправлять сообщения самому себе. К сожалению, способ в лоб — хранить отправляющую половинку канала у себя — приводит к тому, что теперь невозможно полагаться на ошибку получения из канала как на сигнал к прекращению работы актора: Sender у актора удерживает живым весь канал, и потому, если других Sender-ов нет, recv на канале навечно зависает на попытке получить из канала сообщение.
Для решения этой проблемы в tokio есть WeakSender (и WeakUnboundedSender), которые можно считать аналогом
std::sync::Weak<ChannelInner<T>> (что, в общем-то, недалеко от истины). Эти Sender-ы позволяют отправлять сообщения в канал при апгрейде до полноценных версий, но сами по себе не поддерживают канал в живом состоянии — идеально для того, чтобы держать в акторе.Кстати, эта фича была добавлена по запросу, который как раз ссылается на уже упомянутую в Блог*е статью Actors with tokio. Запрос на аналогичную функциональность для каналов в std есть аж с 2016 года, но до сих пор не реализован. И в crossbeam-channel этого тоже нет, увы.
docs.rs
WeakSender in tokio::sync::mpsc - Rust
A sender that does not prevent the channel from being closed.
🔥6🖕2❤1
#prog #rust #rustlib
self_cell — библиотека для создания самоссылающихся структур. По дизайну напоминает ouroboros — для обеспечения стабильности ссылок боксит значение, конструктор для самоссылающихся полей принимает функцию-билдер вместо значения — но, в отличие от последней,
self_cell — библиотека для создания самоссылающихся структур. По дизайну напоминает ouroboros — для обеспечения стабильности ссылок боксит значение, конструктор для самоссылающихся полей принимает функцию-билдер вместо значения — но, в отличие от последней,
self_cell реализована при помощи macro_rules!, из-за чего быстрее компилируется. Это, впрочем, накладывает свои ограничения: макрос ожидает, что структура будет иметь ровно два поля с конкретными именами.docs.rs
self_cell - Rust
Overview
🖕3👍1