Linker Unsafe
220 subscribers
182 photos
24 videos
18 files
859 links
Собираю ржавые и лямбдообразные новости, прикольные цитатки с форумов, ссылки на статьи и всё такое. В-общем, сюда я тащу такие крупицы, которые мне будет жаль потерять в цифровой бездне. Возможно, они покажутся интересными и вам.

Фи сюда: @nlinker
Download Telegram
Linker Unsafe
Photo
Vlad Beskrovnyy:
Ну, вот MIR простой функции, состоящей из двух await'ов других функций (и больше ничего). Я этот свитч имею в виду

Здесь _1 - это первый параметр, т.е. self, т.е. сама реализация фьючера. Видно, что это enum. В _21 записывается дискриминант енама, дальше по нему свитчимся. Ну, собственно, стейтмашина, че...

Kai Ren:
Спасибо за пояснения. Я как-то MIR читать не привык.
Попробуй сделать на чистых футурах без async/.await. Вполне возможно это все те же пляски с генераторами. Там сейчас внутри генератором есть мувы, и это, кстати, боком вылазит в юзер коде с async move {} блоками требую либо Copy либо дополнительных явных клонов.

Vlad Beskrovnyy:
Ну, я бы так не сказал, вроде бы от этого свитча фундаментально не избавиться. Мне просто интересно, почему была выбрана именно такая модель фьючеров, с поллингом всей цепочки. Понимаю, что она была выбрана уже много лет назад, и, вероятно, все уже забыли, но тогда этот выбор должен был быть хорошо мотивирован, полагаю

Вроде звучит разумно, но вот интересно, с тех пор как оно там все Pin, т.е. не может муваться, разве нельзя без аллокаций. А, хотя фьючеры могут быть Unpin...
Forwarded from A64m AL256m qn<cores> I0
ну вот теперь точно
УЛЬТИМЕЙТ 8.10 СНИППЕТ
{-# language UnliftedNewtypes #-}
{-# language StandaloneKindSignatures #-}
{-# language DataKinds, PolyKinds, ExplicitForAll #-}
{-# language ImportQualifiedPost #-}
{-# language MagicHash, UnboxedTuples #-}
module Foo where

import GHC.Types
import GHC.Prim qualified as Prim

type Arr :: forall k -> k -> TYPE(TupleRep[Int32Rep,Int32Rep,AddrRep])
newtype Arr k a = Arr (# Prim.Int32#, Prim.Int32#, Prim.Addr# #)
Зигохистоморфный Препроморфизм:
чтобы при моделировании через фри монады избавится от T -> a нужно энкодить через Free + Coyoneda

λeonid Onokhov:
через GADTs не расширяемо выходит. на каждый тип добавлять конструктор

Зигохистоморфный Препроморфизм:
https://github.com/sacundim/free-operational/blob/master/Control/Monad/Operational/Simple.hs#L24

https://github.com/sacundim/free-operational#example-applicative-version-of-reader

немного описания такого поведения
https://jstimpfle.de/blah/free-monads-gadts.html

ответ Кметта
https://stackoverflow.com/questions/14263363/is-operational-really-isomorphic-to-a-free-monad#comment19859454_14263363
Forwarded from Oleg Andreev
Тут интересная история: самый быстрый и аккуратный стек ZKP криптографии написан на Расте: https://medium.com/interstellar/bulletproofs-pre-release-fcb1feb36d4b

Но не потому что компилятор такой быстрый, а потому что язык позволяет всю логику очень аккуратно организовать, от арифметики кривой, до высокоуровневых протоколов. На плюсах никто из тех, кто понимает тему, не осилил бы это. А криптография, которую пишут на си/с++ - это обычно тихий пиздец.
Forwarded from Mikail Bagishov
А зачем ему брать разность указателей? Ты уверен, что этот кейс не покрывается уже имеющимися решениями? Например, чтобы узнать расположение поля в структуре, есть крейт memoffset.
Проблема в том, что в текущих типах эта проблема вообще не решается. Коротко от лодочника: https://twitter.com/withoutboats/status/1027702531361857536?s=21

Так что есть мнение что чтобы это так работало нужно было прям вообще сильно иначе всё делать. Ну или жить с "почти" монадами, как впрочем и хаскель живет с "почти" категорией Hask.
И Ivan:
А подскажите, можно ли сделать композицию функции с 2-мя параметрами?
Тоесть
f(g(x), h(y))?

Alexander Vershilov:
compose f g h = \x y -> f (g x) (h y)

((flip . ((.) .)) .) . (.) - для любителей pointfree

Sergey:
Читаемо, поддерживаемо, расширяемо )

Alexander Vershilov:
c f g h = curry (uncurry f . first g . second h)

так человечнее
Alexander Vershilov:
Как наиболее дешево getClosureSize сделать в живой программе

ghc-heap-view в собранную пргограмму же докинуть можно?

хм, там же был размер, чот не вижу 😕

ghc-datasize

TIL если не указывать custom-setup, то подставляется зависимость Cabal <1.25

optional-packages - прекрасно, добавил зависимость пропатчил попробовал - выкинул

ghc-datasize показывает ерудну, что делать?

О! Не ерунду

177696 -> 98304 за счет компактов

почти в 2 раза ужать структурку и ещё и сделать удобной для GC

в общем я крайне доволен компактами

самый большой набор ip приводит к токену в 1kb, не очень круто

Denis Redozubov:
ты GC оптимизируешь?

Alexander Vershilov:
Ну так нужно кеш добавить, который заведомо не просадит поведение

А то нагрузка и так хорошая, а ещё и ддосят периодически

HashMap + Generic Vector которые мне в кеше нужны не очень клёвые для GC

А собрать всё в компакт оказалось делом пары строк

Roman:
а выложи эти пару строк посмотреть, пожалуйста

Alexander Vershilov:
+- имена индентификаторов:

ref <- newIORef =<< compact HM.empty
let hdl = Handle $ \cid key -> runExceptT $ do
storage <- liftIO $ fmap getCompact $ readIORef ref
c_storage <- HM.lookup cid storage !!? NoRestriction
V.toList <$> HM.lookup key c_storage !!? Missing
pure (hdl, compact >=> writeIORef ref)

строки о компактах в общем-то только compact и getCompact

Отдает функцию для обновления стоража в фоне и функцию поиска в текущем состоянии
Mike Lubinets:
Но если надо динамически, то тут только боксить, конечно.

Dima:
https://github.com/rust-lang/rust/blob/5205ae8bdc2991eecf3bfbb58ed8f56c0673e738/src/librustc/ty/mod.rs#L603-L706 вот че-то такое в итоге запилил

Mike Lubinets:
Хакерство)
Forwarded from Nikita Vilunov
ты не можешь в расте создать тип, который можно дропнуть только передав какое-то дополнительное значение
Nikita Vilunov:
например тебе нужно закрыть сессию с сервером с каким-то результатом. в линейной системе типов ты бы создал сесионный тип и функцию close(Session, &Msg)

вот тебе пожалуйста юзкейз

Анто Шка:
Ты лучше про BufWriter расскажи и про то, как он в дропе проёбывает ошибки от .flush()

Nikita Vilunov:
вообще интересно зачем ты веришь в то, что у раста линейные типы, у тебя от этого погода солнечнее?

Анто Шка:
А что там рассказывать? BufWriter в дропе дёргает .flush(), чтобы все данные из буфера записались. .flush(), разумеется, может возвращать ошибку. Но если она происходит в дропе, то ты про неё не узнаешь, вообще