@Fsharp_chat

Страница 355 из 772
Friedrich
10.10.2017
07:36:28
@fvnever а может эти типы можно получить через какое-то API?
Да, можно. Но для этого надо передать туда какие-то метадататокены. А чтоб их извлечь из байтов — надо распарсить IL!

Nikolay
10.10.2017
07:36:53
Получить тип + токен

Vasily
10.10.2017
07:37:20
Ну ссылку киньте

Google
Nikolay
10.10.2017
07:37:39
https://github.com/Microsoft/visualfsharp/issues/2406

Friedrich
10.10.2017
07:38:49
В общем, всё к тому идёт, что генеративным провайдерам на коре быть. Я уверен, что коллективными усилиями мы их запилим.

Vasily
10.10.2017
07:39:10
Там интересно, да

Особенно некоторые пассажи

Nikolay
10.10.2017
07:39:36
@fvnever но нависла новая угроза

Типы в IL коде

Friedrich
10.10.2017
07:39:51
Mono.Reflection!

А ещё там вчера была какая-то managed-читалка IL, но я её сегодня уже не могу найти. Похоже, Дон её перепрятал ?

Nikolay
10.10.2017
07:40:41
Щас Сайм скажет, что в компиляторе есть ещё какой-то рефлекшн

Friedrich
10.10.2017
07:40:53
Он был в TPSDK.

Vasily
10.10.2017
07:41:06
Как я понял, в компилятор он тащить пока не хочет поддержку generic tp

Хотя было бы неплохо

Nikolay
10.10.2017
07:41:22
А нет, Сайм не скажет

Google
Nikolay
10.10.2017
07:41:23
Скажу я

https://github.com/Microsoft/visualfsharp/issues/2406

Friedrich
10.10.2017
07:41:25
Во! https://github.com/fsprojects/FSharp.TypeProviders.SDK/blob/193707a4771b4ff6358a95fab46e6f39d5ed0513/src/AssemblyReaderReflection.fs

И, действительно, из мастера этот файл уже удалили :)

Nikolay
10.10.2017
07:43:21
А что за файл .fsy?

https://github.com/Microsoft/visualfsharp/blob/master/src/absil/ilpars.fsy

Friedrich
10.10.2017
07:43:47
Это для fsyacc, наверное?

Э, чо, не, погодь

Там парсер IL-кода на fsyacc чтоли?

Nikolay
10.10.2017
07:45:56
Хз

Evgeniy
10.10.2017
07:46:01
Bus factor компилятора равен единице.

Nikolay
10.10.2017
07:46:11
Я же сказал, нам не нужен будет даже Mono.Reflection :D

Friedrich
10.10.2017
07:46:33
Я же сказал, нам не нужен будет даже Mono.Reflection :D
Зато нам будет нужен код из компилятора, который ещё страшнее.

Bus factor компилятора равен единице.
А вот нифига, будет надо — разберёмся!

Evgeniy
10.10.2017
07:47:05
А вот нифига, будет надо — разберёмся!
Разберитесь, потом обсудим. :)

Nikolay
10.10.2017
07:47:20
Зато нам будет нужен код из компилятора, который ещё страшнее.
Тише ты, а то щас всех новичков распугаешь

Friedrich
10.10.2017
07:47:22
Разберитесь, потом обсудим. :)
Потом ты уже будешь обсуждать с моим лечащим врачом.

Nikolay
10.10.2017
07:47:53
В общем, Фридрих, LSD нам ещё пригодится

Friedrich
10.10.2017
07:48:55
В общем, Фридрих, LSD нам ещё пригодится
Всё равно прорвёмся, нам нечего бояться.

Nikolay
10.10.2017
07:49:58
У тебя хоть есть идеи, с чего начать?

Google
Vlad
10.10.2017
07:50:14
у вас есть репо то, чтоб хотябы понять что вы делаете?)

Friedrich
10.10.2017
07:50:41
У тебя хоть есть идеи, с чего начать?
Я предлагаю продолжать придерживаться плана. - делаем штуку на System.Reflection.Metadata - для парсинга байткодов берём Mono.Reflection

Vlad
10.10.2017
07:51:17
у компилятора код действительно страшный, без диаграмок и блокнотиков его явно не осилить

Evgeniy
10.10.2017
07:51:21
Vlad
10.10.2017
07:51:23
а вот провайдеры еще не открывал

Vasily
10.10.2017
07:51:25
До меня дошло, зачем нужны erased providers

Их просто проще реализовать и поддерживтаь

Vlad
10.10.2017
07:51:42
До меня дошло, зачем нужны erased providers
я так понял чтобы жирные сборки не плодить

Friedrich
10.10.2017
07:51:46
Приходи через полгода.
Какие полгода, Сайм сказал там работы на день ?

Vasily
10.10.2017
07:52:16
Какие полгода, Сайм сказал там работы на день ?
Это ему на день. А @Liminiens пусть через полгода приходит :)

Vlad
10.10.2017
07:52:55
работы на день, а реабилитации на полгода

Friedrich
10.10.2017
07:52:58
Nikolay
10.10.2017
07:53:10
Что именно?
Данный прототип

Friedrich
10.10.2017
07:53:19
Ну, Дон не уверен :)

Я предлагаю вот что.

Nikolay
10.10.2017
07:53:47
Он вселил неуверенность в меня :)

Friedrich
10.10.2017
07:53:51
Я вижу сценарий, по которому реально работы на день.

Mono.Reflection + Mono.Cecil.

Google
Friedrich
10.10.2017
07:54:29
Может быть, код на System.Metadata.Reflection тоже пригодится, не знаю.

Надо собрать прототип из этого, а дальше посмотреть, сконвертуется ли провайдер. Мало ли, вдруг ещё на что-то напоремся.

Nikolay
10.10.2017
07:55:00
Но если Mono проще, почему бы и нет

Friedrich
10.10.2017
07:55:28
И параллельно уже можно будет начинать делать нормальное решение на ilwriter.fs (и, видимо, на AssemblyReaderReflection.fs тоже).

Опыт полученный там точно пригодится
Вот да, за экспу работаем.

Nikolay
10.10.2017
07:56:47
А чем ридер поможет?

Friedrich
10.10.2017
07:56:53
Ну а полученную либу можно будет и оставить как есть. Я уже написал, что это будет просто общественно полезным артефактом.

А чем ридер поможет?
Ридер у нас будет выполнять роль Mono.Reflection.

Nikolay
10.10.2017
07:59:30
Ну если есть понимание, давай делать на моно

Friedrich
10.10.2017
07:59:49
Пока, вроде, есть. Будем делать на Mono.

Nikolay
10.10.2017
08:01:17
Надо ещё разобраться, как верифицировать сборки)

Friedrich
10.10.2017
08:01:25
Надо.

Nikolay
10.10.2017
08:02:21
peverify есть конечно, но он ругается на сборки, сгенерированные компилятором

Evgeniy
10.10.2017
08:25:30
Кто-нибудь пробовал Mutable.Fody? https://github.com/ndamjan/Mutable.Fody

Friedrich
10.10.2017
08:26:37
А как это работает? Само чтоли? В смысле, никаким атрибутом не нужно помечать?

Evgeniy
10.10.2017
08:26:50
Видимо, не нужно.

Friedrich
10.10.2017
08:27:34
Но тогда оно все типы помутирует. А это редко нужно, я думаю.

Может быть нужно только из какого-нибудь неймспейса, например.

Pavel
10.10.2017
08:34:21
На сколько я помню fody достаточно гибко настраивается (для сборки, для неймспейса и т.д.)

Google
Evgeniy
10.10.2017
08:34:49
Надо только доки разыскать. :)

Friedrich
10.10.2017
08:35:03
А, то есть это предлагается рулить настройками самого Fody? Тогда ок.

Pavel
10.10.2017
08:41:59
Ну да, это же addin для fody.

Enhed
10.10.2017
10:52:32
Добрый день. Подскажите, пожалуйста, мне нужен метод который возвращает обобщенный тип abstract GetResponse : unit -> 'provider, в наследнике я пытаюсь, к примеру, вернуть строку из метода, но ругается с ошибкой, ожидается тип 'a, а получен тип string. Не могу понять, как вернуть обобщенный результат, можно ли вообще это сделать? Вот мое переопределение: override this.GetResponse () = "result"

Friedrich
10.10.2017
10:53:26
А что такое 'provider? На каком уровне привязан этот аргумент?

Enhed
10.10.2017
10:54:24
вообще ни на каком, то есть это только метод по сути должен знать, что он возвращает

Evgeniy
10.10.2017
10:54:56
А как это в C# бы выглядело? Кажется, никак.

Friedrich
10.10.2017
10:54:57
Ну вот смотри, ты в родителе объявил метод GetResponse<'T>(): 'T

Значит, он должен возвращать любой тип, который захочет вызыватель.

Enhed
10.10.2017
10:58:15
ну да, что-то я запарился) спасибо

Friedrich
10.10.2017
10:59:08
Я думаю, что твоя задача решается - либо вообще без наследования - либо через параметризирование родительского типа переменной <'provider>

Enhed
10.10.2017
10:59:50
Да, второй вариант я как раз хотел сделать, я внутри наследника уже знаю, что мне нужно вернуть)

В контексте этого же вопроса. Сейчас пытаюсь вернуть обобщенный тип JsonProvider. У меня есть тип type LoginResponse = JsonProvider<"..путь к файлу..">. Результатом я указываю этот тип LoginResponse и пытаюсь вернуть вот так: LoginResponse.GetSample(), а в ответ выдает: ожидался тип LoginResponse, а получен JsonProvider<...>.Root. Кто-нибудь встречался с такой проблемой?

Enhed
10.10.2017
11:29:14
Я почему-то не могу его указать в параметре, пишет, что такой тип не определен. Хотя в контексте тех же методов я к этому типу могу обращаться.

Решил вопрос так: объявил выше type provider = LoginResponse.Root и засунул provider в параметр, все работает, а напрямую не работает)

Evgeniy
10.10.2017
11:32:53
Я почему-то не могу его указать в параметре, пишет, что такой тип не определен. Хотя в контексте тех же методов я к этому типу могу обращаться.
Я бы рекомендовал завести новый настоящий тип для твоего json. И функцию, которая будет с помощью провайдера считывать туда данные.

Проблема в том, что типы, которые генерирует JsonProvider, стираются после компиляции. Может быть сюрприз, если из другой сборки захочется вызвать метод с таким типом в сигнатуре.

Enhed
10.10.2017
11:35:01
Ну, я хотел использовать провайдеры именно для того, чтоб не писать типы руками. В ином случае смысла в них я не вижу.

Страница 355 из 772