Nikolay
А блин
Дмитрий
выглядеть будет ужасно (в фшарпе по крайней мере)
Dr. Friedrich
Мб там специализация какая-то неучтённая.
Dr. Friedrich
Если тут кто понимает, как работает FSPickle, то давайте попробуем сделать через него круто
Nikolay
Microsoft.FSharp.Core.FSharpFunc`2[System.String,Microsoft.FSharp.Core.Unit]
Dr. Friedrich
Вроде должен.
Dr. Friedrich
Мб там как-то совсем косоруко typedefof в этом месте заинлайнился?
Nikolay
Nikolay
Заходит туда
Dr. Friedrich
Ну лан
Nikolay
Ну короче такое генерит оно
Dr. Friedrich
На строчке debugLog "That: %d - %d = %d" 2 2 4 у меня сгенерилось такое:
Microsoft.FSharp.Core.FSharpFunc`2[System.Int32,Microsoft.FSharp.Core.FSharpFunc`2[System.Int32,Microsoft.FSharp.Core.FSharpFunc`2[System.Int32,Microsoft.FSharp.Core.Unit]]]
Dr. Friedrich
Как я и предполагал, там всегда функция от одного аргумента.
Dr. Friedrich
Это упрощает дело, не правда ли?
Nikolay
Хм, да
Nikolay
И юнит всегда возвращаем
Dr. Friedrich
Остаётся сделать кэш таких функций
Dr. Friedrich
Правда, кажись, negate придётся разынлайнить
Pavel
Dr. Friedrich
Pavel
почему?
Dr. Friedrich
Ну, рефлекшеном можно у функции спросить количество аргументов, и там могут оказаться разные интересные числа, не равные единице.
Dr. Friedrich
В программировании.
Nikolay
Блин, а вот с генерацей функции проблемы 🙁
Dr. Friedrich
Я щя сделаю
Nikolay
Будет работать с AOT?
Dr. Friedrich
Dr. Friedrich
А тебе именно в AOT надо?
Nikolay
Ну вот поэтому и проблемы
Nikolay
Да)
Dr. Friedrich
Тогда давай другой подход прикинем
Dr. Friedrich
На тайппровайдерах не получится?
Nikolay
Написать тайппровайдер?
Dr. Friedrich
(я понимаю, что идея спорная, но хоть что-то)
Nikolay
Dr. Friedrich
Dr. Friedrich
Dr. Friedrich
В F# не все функции сводятся к тем, аргументы которых можно запаковать в туполь.
Dr. Friedrich
Ну и это настоящая проблема
Dr. Friedrich
Потому что компилятор, как и ты, временами погружается в пучину иллюзий
Dr. Friedrich
https://github.com/dotnet/fsharp/issues/3362 вот пример
Dr. Friedrich
У меня есть функция, которая принимает uint32&, ссылку.
Dr. Friedrich
Компилятор решил, что хорошая идея — параметр пак для этой функции обернуть в туполь и положить в кучу.
Dr. Friedrich
Но вот незадача: этот параметр пак невозможно обернуть в туполь!
Дмитрий
Дмитрий
Dr. Friedrich
Dr. Friedrich
Напиши на норм языке
Nikolay
@fvnever а тайп провайдер должен получается тупо заглушки генерить жеж?
Дмитрий
так я же уже написал
Dr. Friedrich
так я же уже написал
Я уже подумываю о том, чтобы в пронете твоё право голоса ограничить, кстати.
Dr. Friedrich
Dr. Friedrich
Но тут проблема в том, что ты не можешь его параметризовать типом
Дмитрий
Dr. Friedrich
эээээ
Слишком много не по делу пишешь.
Nikolay
Dr. Friedrich
блжть
Ну вот да. Давай думать дальше.
Dr. Friedrich
В принципе, у нас набор типов в этом месте очень ограничен
Dr. Friedrich
Там бывают только вот эти все %s %d %A
Dr. Friedrich
То есть всякие там примитивы, ну и ещё обжекты для %A
Dr. Friedrich
Однако, мы не можем захардкодить огромный свитч по типам
Dr. Friedrich
Потому что там бывают вложенные функции (вот типа моего примера выше), и это комбинаторный взрыв получается.
Nikolay
Ну да, я думал, главный трабл в том, что тип там любой может быть
Dr. Friedrich
щящя, погоди
Dr. Friedrich
SRTP нас не спасёт?
Dr. Friedrich
Давай пробовать на SRTP, ёпта
Dr. Friedrich
Там вот как раз можно выпендриться, давайте выпендриваться
Nikolay
А сртп как поможет?
Dr. Friedrich
Я это утверждение опроверг
Dr. Friedrich
Если у тебя что-то более расплывчатое, то я обсуждать не буду.
Dr. Friedrich
Dr. Friedrich
Я думаю, что поможет
Pavel
Dr. Friedrich
Нам просто нужно сделать два кейса SRTP