Впрочем, я отвлёкся.
Второй аргумент — это
Ещё раз взглянем на замыкание целиком:
Окей, с замыканием мы разобрались. Но чтобы понять, что же оно в итоге возвращает, нам нужно посмотреть на то, с какими аргументами оно вызывается:
Теперь сложим вместе всё изложенное выше. Переменной
Как видите, тут нет абсолютно ничего сложного. 👌
Второй аргумент — это
__ @ _
. Как всегда в @-биндингах (ладно, ладно, at-биндингах), справа от @
находится паттерн — в данном случае _
, который матчится абсолютно со всем — а слева от @
находится имя, которое привязывается к этому значению, __
. Безусловно, идентификатор выглядит странно, но это валидное имя в Rust.Ещё раз взглянем на замыкание целиком:
|(..): (_, _), __ @ _| __
Тело замыкания состоит из единственного идентификатора __
. Иными словами, замыкание просто возвращает свой второй аргумент. С тем же успехом его можно было бы написать так:|_, second| second
(или, если быть точнее и сохранить тот факт, что первый аргумент является парой, |_: (_, _), second| second
).Окей, с замыканием мы разобрались. Но чтобы понять, что же оно в итоге возвращает, нам нужно посмотреть на то, с какими аргументами оно вызывается:
(замыкание...)((&*"\\", '🤔'), {})
Первый аргумент — это пара (как и ожидается) из &str
и char
. Фрагмент &*"\\"
валиден за счёт того, что строковой литерал имеет тип &'static str
и, соответственно, его можно разыменовать (и взять ссылку от результата). Кстати, тут используется синтаксис для escaping-а, поэтому содержимое строки — это единственный символ \
. А вот второй аргумент — это пустой блок. В Rust он вычисляется в ()
. С учётом того, что замыкание просто возвращает свой второй аргумент, получаем, что часть слева от оператора равенства просто возвращает ()
.Теперь сложим вместе всё изложенное выше. Переменной
val
присваивается отрицание от сравнивания ()
и ()
. Так как unit всегда равен самому себе, в val
записывается значение false
. Строчкой ниже в функции вызывается assert!(!val)
, который ожидаемо проходит.Как видите, тут нет абсолютно ничего сложного. 👌
#prog #rust #itsec
blog.rust-lang.org/2022/01/20/cve-2022-21658.html
> Rust 1.0.0 through Rust 1.58.0 is affected by this vulnerability.
Oof
blog.rust-lang.org/2022/01/20/cve-2022-21658.html
> Rust 1.0.0 through Rust 1.58.0 is affected by this vulnerability.
Oof
Forwarded from Life of Tau
в чате по питону обсуждали такую задачу:
нужно написать функцию add, которая ведёт себя так:
тут используется None, хотя следовало бы создать свой sentinel или смотреть количество аргументов - вдруг кому-то придёт в голову сложить что-то с None
а потом я решила написать это на расте... встречайте:
#prog #rust #python
нужно написать функцию add, которая ведёт себя так:
>>> add(1)(2)(3)()
6
>>> add(1)(2)(3)(4)()
10
ну в принципе ничего сложного:def add(succ = None):
acc = getattr(add, "_acc", 0)
if succ is None:
if hasattr(add, "_acc"):
del add._acc
return acc
add._acc = acc + succ
return add
тут используется None, хотя следовало бы создать свой sentinel или смотреть количество аргументов - вдруг кому-то придёт в голову сложить что-то с None
а потом я решила написать это на расте... встречайте:
#![feature(fn_traits, unboxed_closures)]
use std::ops::Add;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct Adder<T> {
acc: T,
}
impl<L, R, O> FnOnce<(R,)> for Adder<L>
where
L: Add<R, Output = O>,
{
type Output = Adder<O>;
extern "rust-call" fn call_once(self, (succ,): (R,)) -> Self::Output {
Adder {
acc: self.acc + succ,
}
}
}
impl<A> FnOnce<()> for Adder<A> {
type Output = A;
extern "rust-call" fn call_once(self, (): ()) -> Self::Output {
self.acc
}
}
#[allow(non_camel_case_types)]
pub struct add;
impl<A> FnOnce<(A,)> for add {
type Output = Adder<A>;
extern "rust-call" fn call_once(self, (acc,): (A,)) -> Self::Output {
Adder { acc }
}
}
fn main() {
println!("{}", add(1)(2)(3)());
}
единственное, что не получилось сделать - разрешить делать сразу add()#prog #rust #python
play.rust-lang.org
Rust Playground
A browser interface to the Rust compiler to experiment with the language
#prog #rust
Does the Bronze Garbage Collector Make Rust Easier to Use? A Controlled Experiment
Разумеется, я не мог пройти мимо статьи с подобнымеретическим громким заявлением. Авторы разработали сборщик мусора, решив при помощи stack maps от LLVM проблемы идентификации корней. Как сказано в абстракте:
> We found that for a task that required managing complex aliasing, Bronze users were more likely to complete the task in the time available, and those who did so required only about a third as much time (4 hours vs. 12 hours). We found no significant difference in total time, even though Bronze users re-did the task without Bronze afterward.
Однако меня заинтересовал сам сборщик мусора. В тексте я натолкнулся на упоминание того, что в эксперименте использовалась версия, которая фактически сборку мусора не проводила. Меня это насторожило. Я пошёл смотреть исходники и увидел issue (со ссылкой на URLO) о том, что bronze позволяет иметь две мутабельные ссылки на одно и то же значение одновременно. Что вообще-то UB. Таким образом, авторы фактически проверяли не "Rust со сборщиком мусора", а "Rust с выключенным borrow checker", что фактически ставит под сомнение результаты эксперимента. Авторы при этом ничего страшного в этом не видят. Более того, в треде отметили, что авторы скопировали часть кода из rust-gc от Manish Earth, при том,что bronze имел лицензию BSD, а rust-gc — Mozilla Public License 2.0, копилефтную лицензию.
Короче, дурная история
Does the Bronze Garbage Collector Make Rust Easier to Use? A Controlled Experiment
Разумеется, я не мог пройти мимо статьи с подобным
> We found that for a task that required managing complex aliasing, Bronze users were more likely to complete the task in the time available, and those who did so required only about a third as much time (4 hours vs. 12 hours). We found no significant difference in total time, even though Bronze users re-did the task without Bronze afterward.
Однако меня заинтересовал сам сборщик мусора. В тексте я натолкнулся на упоминание того, что в эксперименте использовалась версия, которая фактически сборку мусора не проводила. Меня это насторожило. Я пошёл смотреть исходники и увидел issue (со ссылкой на URLO) о том, что bronze позволяет иметь две мутабельные ссылки на одно и то же значение одновременно. Что вообще-то UB. Таким образом, авторы фактически проверяли не "Rust со сборщиком мусора", а "Rust с выключенным borrow checker", что фактически ставит под сомнение результаты эксперимента. Авторы при этом ничего страшного в этом не видят. Более того, в треде отметили, что авторы скопировали часть кода из rust-gc от Manish Earth, при том,что bronze имел лицензию BSD, а rust-gc — Mozilla Public License 2.0, копилефтную лицензию.
Короче, дурная история
GitHub
GitHub - mcoblenz/Bronze
Contribute to mcoblenz/Bronze development by creating an account on GitHub.
👍1
#prog #article
The Discovery of Apache ZooKeeper’s Poison Packet — статья от 2015 года об экзотическом баге, который связал воедино баги в ZooKeeper и ядре Linux. Да, серьёзно.
(thanks @oleg_log)
The Discovery of Apache ZooKeeper’s Poison Packet — статья от 2015 года об экзотическом баге, который связал воедино баги в ZooKeeper и ядре Linux. Да, серьёзно.
(thanks @oleg_log)
PagerDuty
The Discovery of Apache ZooKeeper's Poison Packet
We uncovered 4 bugs causing random cluster-wide lockups. Two bugs laid in ZooKeeper, and the other two were lurking in the Linux kernel. This is our story.
Forwarded from мне не нравится реальность
Я нашёл ICE [internal compiler error], которой можно добиться за 29 символов программы 🙂
Правда ICE чисто технически в форматтере, но всё же.
Правда ICE чисто технически в форматтере, но всё же.
macro_rules! a{()=>{A<'a,>};}
👍10👎3😁3🤩2
Forwarded from мне не нравится реальность
Когда я плакал, что не понимаю атомики (я и сейчас плачу, ахаха), мне посоветовали посмотреть несколько докладов, включая этот (в двух частях):
— CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part I"
— CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part II"
Доклад очень интересный, рекомендую!!
В начале рассказывается про атомики в целом, а потом приводятся примеры того, как их можно использовать. В самом конце убийственный пример из реальной жизни, приведу цитату: «And for better performance we'll do more heap allocations».
Доклад в большей степени ориентирован на тех кто не очень хорошо знает что такое атомики, но и для тех кто знает не плохо, думаю тоже будет полезно.
— CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part I"
— CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part II"
Доклад очень интересный, рекомендую!!
В начале рассказывается про атомики в целом, а потом приводятся примеры того, как их можно использовать. В самом конце убийственный пример из реальной жизни, приведу цитату: «And for better performance we'll do more heap allocations».
Доклад в большей степени ориентирован на тех кто не очень хорошо знает что такое атомики, но и для тех кто знает не плохо, думаю тоже будет полезно.
YouTube
CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part I"
https://www.cppcon.org
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/CppCon/CppCon2014
--
Example-driven talk on how to design and write lock-free algorithms and data structures using C++ atomic…
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/CppCon/CppCon2014
--
Example-driven talk on how to design and write lock-free algorithms and data structures using C++ atomic…
👍6
Посмотрел тут свои гисты от и до, и... Ну, неудивительно, что я Rust простым называю, я его, выходит, учу уже четыре года.
👍3😱2😢1
— Ты когда-нибудь перестанешь упоминать Rust по поводу и без?
—
—
println!("Нет");
🔥14🤮6😁4❤2👎2👍1😱1🎉1
Forwarded from Life of Tau
Twitter
Tushar Sadhwani
🐍Python news: CPython's main branch now compiles to webassembly! Thanks to @ethanhs and @ChristianHeimes Meaning: You can natively download and run Python in the browser. It's about a 5MB package right now. There's plans to make it smaller. Try it here: repl.ethanhs.me
😱7❤3🔥1