1.84K subscribers
3.27K photos
130 videos
15 files
3.55K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Forwarded from shitposting 3.0 [+ dragons]
😁8🖕1
🖕1
Forwarded from shitposting 3.0 [+ dragons]
😁14🖕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 descriptive, rather than prescriptive — 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.
🔥2🤔1🖕1
🥰23🖕8
Forwarded from Above all that is random
❤‍🔥15👍8💩4😁2🖕21
-> ControlFlow<Self, Self>

#justrustaceanthings
🖕2
Forwarded from Neural Machine
Звонить людям никогда не следует
👍25👎62🖕2❤‍🔥1
Forwarded from shitposting 3.0 [+ dragons]
😁26🤔3🖕21
Блог*
#prog #rust #rustasync #article Efficient indexing with Quickwit Rust actor framework Или немного о том, почему разработчики Quickwit решили реализовать свой акторный фреймворк. Также в тексте есть ссылка на статью Actors with Tokio, которая описывает, как…
#prog #rust #rustasync

Если вы делаете что-то с акторами в Rust, может быть полезно иметь у актора возможность отправлять сообщения самому себе. К сожалению, способ в лоб — хранить отправляющую половинку канала у себя — приводит к тому, что теперь невозможно полагаться на ошибку получения из канала как на сигнал к прекращению работы актора: Sender у актора удерживает живым весь канал, и потому, если других Sender-ов нет, recv на канале навечно зависает на попытке получить из канала сообщение.

Для решения этой проблемы в tokio есть WeakSenderWeakUnboundedSender), которые можно считать аналогом std::sync::Weak<ChannelInner<T>> (что, в общем-то, недалеко от истины). Эти Sender-ы позволяют отправлять сообщения в канал при апгрейде до полноценных версий, но сами по себе не поддерживают канал в живом состоянии — идеально для того, чтобы держать в акторе.

Кстати, эта фича была добавлена по запросу, который как раз ссылается на уже упомянутую в Блог*е статью Actors with tokio. Запрос на аналогичную функциональность для каналов в std есть аж с 2016 года, но до сих пор не реализован. И в crossbeam-channel этого тоже нет, увы.
🔥6🖕21
Я:
— Ты же задолбаешься.

Андрей (@ozkriff):
— Да! 🤩

#quotes #wafflecontext
😐8🤩2🖕2🎉1
#prog #rust #rustlib

self_cell — библиотека для создания самоссылающихся структур. По дизайну напоминает ouroboros — для обеспечения стабильности ссылок боксит значение, конструктор для самоссылающихся полей принимает функцию-билдер вместо значения — но, в отличие от последней, self_cell реализована при помощи macro_rules!, из-за чего быстрее компилируется. Это, впрочем, накладывает свои ограничения: макрос ожидает, что структура будет иметь ровно два поля с конкретными именами.
🖕3👍1
Forwarded from shitposting 3.0 [+ dragons]
Напоминание
😁157🖕2
❤‍🔥20🖕2
Новость оцениваю положительно, но чо та на Опёнке минусов напихали

Разработчики репозитория Python-пакетов PyPI (Python Package Index) объявили о решении перевести все учётные записи пользователей, сопровождающих хотя бы один проект или входящих в курирующие пакеты организации, на обязательное применение двухфакторной аутентификации. Перевод планируют завершить до конца 2023 года. До намеченного срока будет проведено поэтапное ограничение доступной функциональности для разработчиков, не включивших двухфакторную аутентификацию.

PyPI переходит на обязательную двухфакторную аутентификацию
https://www.opennet.ru/opennews/art.shtml?num=59198
👍6🖕4🤔2
#prog #rust

Пусть есть вот такой не шибко сложный код:

use std::rc::Rc;

struct Thing;
trait Trait {}
impl Trait for Thing {}

struct Holder {
inner: Rc<dyn Trait>,
}

fn f() {
let thing = Rc::new(Thing);
let holder = Holder {
inner: Rc::clone(&thing),
};
}

Этот код не компилируется:

error[E0308]: mismatched types
--> src/lib.rs:14:26
|
14 | inner: Rc::clone(&thing),
| --------- ^^^^^^ expected `&Rc<dyn Trait>`, found `&Rc<Thing>`
| |
| arguments to this function are incorrect
|
= note: expected reference `&Rc<dyn Trait>`
found reference `&Rc<Thing>`


Кто-то посчитал это багом и сделал issue, но, как оказалось, это ожидаемое поведение. Это опирается на два факта:

* unsize coercion работает через один уровень индирекции, но не через два;
* type coercions не работают в случае, если требуется вывести тип.

Для компилирования этого кода значение thing типа Rc<Thing> требуется преобразовать в Rc<dyn Trait>. Для этого преобразования требуется coercion site.

1. Преобразование не может пройти в привязке Rc::new(Thing) к thing, поскольку к имени не приписан явно тип.
2. Преобразование не может пройти по месту вызова Rc::clone, поскольку выражение &thing имеет тип &Rc<Thing>, которое не может быть преобразовано в &Rc<dyn Trait> из-за двойной индирекции (Rc уже является указателем).
3. Преобразование не может пройти по месту присваивания значения полю inner. Так как был сделан вызов Rc::clone, что де-факто сокращение для <Rc<_> as Clone>::clone и требует вывода типов, coercion не рассматривается. Поэтому тип функции выводится для точного совпадения возвращаемого типа с ожидаемым в этом месте, то есть как <Rc<dyn Trait> as Clone>::clone. Аргумент для функции должен быть, таким образом, &Rc<dyn Trait>, что не работает (см. пункт 2).

Что же можно сделать для того, чтобы заставить код компилироваться? Есть несколько путей.

1. Добавить coercion site по месту let, то есть явно написать тип:

let thing: Rc<dyn Trait> = Rc::new(Thing);

2. Убрать необходимость в выводе типов по месту вызова Rc::clone. Для этого можно воспользоваться синтаксисом метода:

let holder = Holder {
inner: thing.clone(),
};

В этом случае тип выражения thing.clone() однозначно выводится, как Rc<dyn Trait>, и потому unsize coercion происходит по месту присвоения значения полю структуры.

3. Разнести вывод типов и type coercion:

let another_thing = Rc::clone(&thing);
let holder = Holder {
inner: another_thing,
};

В этом случае unsize coercion происходит опять по месту присвоения значения поля, а создание another_thing однозначно выводит тип another_thing, как Rc<Thing>.

Так что вот вам случай, когда Rc::clone хуже, чем .clone(), вопреки линтам.
🤔13👍4🤯3🖕2
investors: do you use AI in your startup?
me: for what?
investors:
🌚14😁6🤯2🤡2😐2🖕1
Котики - то святе!
Photo
Я, конечно, понимаю, что какой-то хейтер проставил "🖕" сплошняком по всем последним постам, но на посте с котятами? Серьёзно?
🖕22💔16🤡4🤔3🍌2