Alexander
вот у янга вроде по теме блоги были
A64m
да, но там совсем поверхностно обычно, еще у него есть недописанный пейпер с обзором ртс, там все очень неподробно
Alexander
дункана чтоли пнуть как обычно
A64m
т.е. на самом деле можно что-то точно узнать если в сишный код смотреть, но это ад адский
Alexander
он минимум подскажет какие правильные вопросы кому задавать
Alexander
причем чуть ли не в cmm
Alexander
ладно, допустим у нас есть эффективное место где можно ресурсы регистрировать, чтобы не таскать IORef
Alexander
но тогда появляется вопрос, как идентифицировать ресурс, чтобы убрать его оттуда если он явно освобождается
Alexander
в ResourceT и у меня для этого введен ключ
Alexander
в ResourceT это вообще небезопасно, у меня добавляется экзестенциальная переменная
Alexander
т.е. удалить объект можно только с его ключем
Alexander
и нельзя перепутать
Alexander
но это добавляет indirection
Alexander
можно запрятать ключь в объект, но это все равно indirection, хотя и подешевле
Alexander
наверное можно делать регистр под тип ресурс, и какой-нить класс типов
Alexander
интересно как в расте сделано
A64m
а как compactContains# работает? Но же вроде быстрый? По идее он проверяет что обе ссылки на один блок в хипе?
Alexander
надо посмотреть
Alexander
но мне казалось, что у них там хештаблица
Alexander
StgWord compactContains (StgCompactNFData *str, StgPtr what) { bdescr *bd; // This check is the reason why this needs to be // implemented in C instead of (possibly faster) Cmm if (!HEAP_ALLOCED (what)) return 0; // Note that we don't care about tags, they are eaten // away by the Bdescr operation anyway bd = Bdescr((P_)what); return (bd->flags & BF_COMPACT) != 0 && (str == NULL || objectGetCompact((StgClosure*)what) == str); }
Alexander
магия какая-то
Leonid 🦇
а я почём знаю
Кабачок
Ты про JavaEE не слышали?
Leonid 🦇
народ ныл в твитторе что функтор это непонятно, а маппабл это энтерплайзно
Кабачок
А если функтор переименую в маппабл, то фмап станет мап?
Leonid 🦇
ну fmap так называется исключительно в силу историчских причин.
A64m
магия какая-то
ну сначала он проверяет аллоцировано ли это в гхц хипе, потом он проверяет помечен ли блок памяти, в котором объект находится как компакт, а потом только сравнивает данный компакт с получаемым для объекта - т.е. самого интересного-то нет оно в функции objectGetCompact
Alexander
да там тоже ничего и в objectGetCompactBlock который она вызывает
Alexander
INLINE_HEADER StgCompactNFDataBlock *objectGetCompactBlock (StgClosure *closure); INLINE_HEADER StgCompactNFDataBlock *objectGetCompactBlock (StgClosure *closure) { bdescr *object_block, *head_block; object_block = Bdescr((StgPtr)closure); ASSERT ((object_block->flags & BF_COMPACT) != 0); if (object_block->blocks == 0) head_block = object_block->link; else head_block = object_block; ASSERT ((head_block->flags & BF_COMPACT) != 0); return (StgCompactNFDataBlock*)(head_block->start); }
A64m
ну да, блоки компакта же в список объеденены, так что он сравнивает не то, что данный компакт тот же блок, что и блок в котором объект, но то проверяет, что блок в котором объект в списке блоков данного компакта
A64m
все равно должно быть более-менее быстро
A64m
ну, т.е. быстрее хеш-таблицы
Alexander
угу
Alexander
но для ресурсов же такое не провернёшь
Alexander
например если я хочу иметь переменную в которой отмечено была ли она освобождена
Alexander
то одного объекта мне недостаточно для того, чтобы её найти
A64m
есть компакт Ресурсы есть компакт Освобожденные
Alexander
а добавление в compact насколько дешевое?
Alexander
а ещё есть доп сложность
Alexander
userResource :: Resource ->. IOL (Resource. Smth)
A64m
копирование. Те. копирование забоксенного инта в данном случае, больше инта же ничего не надо чтоб ресурс вне хипа представить
Alexander
мне нужно чтобы новый инстанс ресурса был связан со старым
Alexander
вот, да, т.е. мне для ресурса грубо говоря надо чтобы значение ресурса ставило ему в соотвествие Int
Alexander
указатель там, номер хэндла ещё что
A64m
да
Alexander
тогда видимо по компакту на тип?
A64m
ну да
Alexander
а ну или ресурс всегда Boxed
A64m
да
Alexander
это наверное даже проще
Alexander
т.е. ресурс ~ Storable
Alexander
аллоцируем кусок, кладем туда значение обычное, ну если вопрос о хендле каком
Alexander
когда доставать должны использовать peek
Alexander
небезопасненько
Alexander
хотя с другой стороны это размер будет пропорционален количеству выделенных ресурсов
Alexander
что в общем-то unbounded
Евгений
Denis
классика
Anonymous
оо замечательно
Евгений
Напоминает мне код на агде, на самом деле
Alexander
нельзя пользоваться языками для которых основная IDE это емакс
Alexander
там у программистов появляется юникодный хэдкраб
кана
Самое удобное программирование с юникодом имхо на вскоде с lean-плагином
Alexander
мне как-то unicode не удобен
Alexander
но я не емаксер
Anonymous
хз что за связь между юникодом и емаксом
Alexander
а нём есть достаточно удобные плагины чтобы писать смешные символы
Alexander
а придумайте мне как сделать newtype но строгий?
A64m
не понял
Leonid 🦇
Никак
Leonid 🦇
Он и так не ленивый
A64m
не Type в смысле?
Alexander
Prelude> newtype W = W Int Prelude> x = W (undefined) Prelude> case x of W _ -> 7 7
Alexander
ну совсем не ленивый
Alexander
строже некуда
Alexander
хочется с семантикой data W = W !Int
Alexander
Prelude> data W = W !Int Prelude> x = W undefined Prelude> case x of W _ -> 7 *** Exception: Prelude.undefined