Forwarded from Αλεχ Zhukovsky
whileM' : (Monad m, Monad f, Alternative f) => (a -> Bool) -> m a -> m (f a)
whileM' p f = go
where go = do
x <- f
if p x
then do
xs <- go
pure (pure x <|> xs)
else pure empty
whileM : Monad m => (a -> Bool) -> m a -> m (List a)
whileM = whileM'
@hirrolot если вдруг нужен такой комбинатор в идрсе - держи. Чуваки из чатика не смогли сделать версию которая работает, у меня с божьим чудом и хуглом - вышло
Forwarded from Αλεχ Zhukovsky
Gist
chapt3.idr
GitHub Gist: instantly share code, notes, and snippets.
Привет всем. Кто то знает библиотеку для генерации .eps 10 . пока я это делаю в Adobe illustrator а это очень нагружает систему
Forwarded from hirrolot
мои тип-суммы в си готовы: https://godbolt.org/z/zucUUN
автоматическая генерация конструкторов значений и патмат с проверкой исчерпаемости
автоматическая генерация конструкторов значений и патмат с проверкой исчерпаемости
godbolt.org
Compiler Explorer - C (x86-64 gcc 9.3)
#define NARGS_AUX( \
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
_31, _32, _33,…
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
_31, _32, _33,…
Forwarded from Внутри Хирролота
Тип-суммы для Си, включая автоматическую генерацию конструкторов значений и проверку исчерпаемости в сопоставлении с образом: https://gist.github.com/Hirrolot/b62d763c0f7c558a737618a0f4e48650
Нужно ещё рефакторить, но оно уже работает!
Нужно ещё рефакторить, но оно уже работает!
Gist
Sum types for C11
Sum types for C11. GitHub Gist: instantly share code, notes, and snippets.
Forwarded from Mikail Bagishov
Ну, использование пула ортогонально использованию асинхронного клиента
Forwarded from hirrolot
Forwarded from red75prime
Behold Duff's device
strcpy(to, from, count)
register char *to, *from;
register count;
{
register n = (count + 7) / 8;
if (!count) return;
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}
Forwarded from p0lunin
Зацените мои наркоманские мысли по поводу менеджмента памяти:
1. По умолчанию объекты хранятся на стеке.
2. Есть Copy и не-Copy типы. Первые при передаче в функции копируются всегда, вторые муваются (типо как в расте).
3. Есть Movable и не-Movable типы данных. По умолчанию тип Movable - значит при передаче в качестве аргумента он будет муваться. Если объект не Movable, значит его владение нельзя никуда передавать.
4. Предыдущий пункт нужен чтобы провернуть следующую штуку. Будет встроенный тип Ref (ссылка), который сам Movable, а внутри держит не-Movable тип (ну обычный указатель, хули). Но как вы уже поняли внутрь него нельзя поместить обычный тип так как он Movable. Для того чтобы сделать !Movable тип, можно использовать:
1. Pin, который гарантирует что данные не уйдут со стека.
2. Box, который гарантирует что данные хранятся в динамической памяти и не сдвинутся.
3. Rc.
Ну и может ещё пару умных указателей если понадобятся.
5. Итого как это будет работать: если вам необходимо передать из метода ссылку в другой метод на данные на стеке, вам нужно их припинить. Сам пин это просто маркер, то есть он зиро кост и нужен только для борроу чекера. Затем создаётся ссылка и передается в функцию. Там функция делает чё она хочет с ссылкой как с обычным объектом (как в расте).
6. Если хочется передать ссылку в другой поток то будешь огорчён потому что ссылки не Send, поэтому создавай что-то другое.
7. У меня нет никаких глобальных переменных от слова совсем, так что передать ссылку куда-то так чтобы она стала невалидной невозможно (ну на самом деле не оч так, смотри следующий пункт).
И все вроде заебись (или нет), но я хз чё делать с возвратом ссылки из метода наверх. Как проверить, закончилось время жизни внутренних данных или нет. Вообще зачем я это все придумал - чтобы избавиться от лайфтаймов. Но хз как чекать возвращаемую ссылку без лайфтаймов. Не ну я представляю как это можно сделать, но кмк это сильно удлинит время компиляции из-за проверки всего лайфтайма объекта и ссылок на него.
Оцените по шкале юзабкльности от 1 до 10
1. По умолчанию объекты хранятся на стеке.
2. Есть Copy и не-Copy типы. Первые при передаче в функции копируются всегда, вторые муваются (типо как в расте).
3. Есть Movable и не-Movable типы данных. По умолчанию тип Movable - значит при передаче в качестве аргумента он будет муваться. Если объект не Movable, значит его владение нельзя никуда передавать.
4. Предыдущий пункт нужен чтобы провернуть следующую штуку. Будет встроенный тип Ref (ссылка), который сам Movable, а внутри держит не-Movable тип (ну обычный указатель, хули). Но как вы уже поняли внутрь него нельзя поместить обычный тип так как он Movable. Для того чтобы сделать !Movable тип, можно использовать:
1. Pin, который гарантирует что данные не уйдут со стека.
2. Box, который гарантирует что данные хранятся в динамической памяти и не сдвинутся.
3. Rc.
Ну и может ещё пару умных указателей если понадобятся.
5. Итого как это будет работать: если вам необходимо передать из метода ссылку в другой метод на данные на стеке, вам нужно их припинить. Сам пин это просто маркер, то есть он зиро кост и нужен только для борроу чекера. Затем создаётся ссылка и передается в функцию. Там функция делает чё она хочет с ссылкой как с обычным объектом (как в расте).
6. Если хочется передать ссылку в другой поток то будешь огорчён потому что ссылки не Send, поэтому создавай что-то другое.
7. У меня нет никаких глобальных переменных от слова совсем, так что передать ссылку куда-то так чтобы она стала невалидной невозможно (ну на самом деле не оч так, смотри следующий пункт).
И все вроде заебись (или нет), но я хз чё делать с возвратом ссылки из метода наверх. Как проверить, закончилось время жизни внутренних данных или нет. Вообще зачем я это все придумал - чтобы избавиться от лайфтаймов. Но хз как чекать возвращаемую ссылку без лайфтаймов. Не ну я представляю как это можно сделать, но кмк это сильно удлинит время компиляции из-за проверки всего лайфтайма объекта и ссылок на него.
Оцените по шкале юзабкльности от 1 до 10
Forwarded from p0lunin
Ты прочитал?
Без пина нельзя взять ссылку на объект, потому что нельзя взять ссылку на Movable данные
Без пина нельзя взять ссылку на объект, потому что нельзя взять ссылку на Movable данные
Forwarded from 🇰 🇷 🇦 🇹 🇴 🇸😜
It's good idea to learn rust making desktop apps rather tha c++ or java?
Roman Beltyukov:
Ну это понятно, но почему статик? Т.е. мы заставляем лямбду жить до конца рантайма?
red75prime:
Мы говорим, что лямбда не захватывает ссылки на локальные переменные
https://news.1rj.ru/str/rust_beginners_ru/63071
Ну это понятно, но почему статик? Т.е. мы заставляем лямбду жить до конца рантайма?
red75prime:
Мы говорим, что лямбда не захватывает ссылки на локальные переменные
https://news.1rj.ru/str/rust_beginners_ru/63071
Telegram
Roman Beltyukov in Rust Beginners
Ну это понятно, но почему статик? Т.е. мы заставляем лямбду жить до конца рантайма?
Вафель 🧇:
Но более правильным решением наверное всё же будет параметризовать всё лайфтаймом: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=82e3ca44e0d340557b3a5308fa14bea1
Это всё таки не "до конца жизни структуры", а до конца 'l :)
Разницу может быть сложно прочувствовать, но она есть
Roman Beltyukov:
Rc нужен, потому что он иначе не хочет иметь Vec<dyn Fn(&R) -> bool + 'l>, т.к. не знает размер в компайл тайме
Вафель 🧇:
В таких случаях нужен Box, а не Rc :)
Roman Beltyukov:
no method named
Вафель 🧇:
Ааа...
Это можно обойти, но есть ощущение что с Rc будет тупо проще. Тут нужно найти/написать крейт для клонирования unsized типов за указателями...
Вообще этого мне кажется не хватает в стд
О, во, dyn-clone есть
https://news.1rj.ru/str/rust_beginners_ru/63073
Но более правильным решением наверное всё же будет параметризовать всё лайфтаймом: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=82e3ca44e0d340557b3a5308fa14bea1
Это всё таки не "до конца жизни структуры", а до конца 'l :)
Разницу может быть сложно прочувствовать, но она есть
Roman Beltyukov:
Rc нужен, потому что он иначе не хочет иметь Vec<dyn Fn(&R) -> bool + 'l>, т.к. не знает размер в компайл тайме
Вафель 🧇:
В таких случаях нужен Box, а не Rc :)
Roman Beltyukov:
no method named
clone found for struct std::vec::Vec<std::boxed::Box<(dyn for<'r> std::ops::Fn(&'r R) -> bool + 'l)>> in the current scopeВафель 🧇:
Ааа...
Это можно обойти, но есть ощущение что с Rc будет тупо проще. Тут нужно найти/написать крейт для клонирования unsized типов за указателями...
Вообще этого мне кажется не хватает в стд
О, во, dyn-clone есть
https://news.1rj.ru/str/rust_beginners_ru/63073
Telegram
Вафель 🧇 in Rust Beginners
Но более правильным решением наверное всё же будет параметризовать всё лайфтаймом: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=82e3ca44e0d340557b3a5308fa14bea1