@Fsharp_chat

Страница 358 из 772
Friedrich
11.10.2017
15:48:51
Мне за F# в проде будут больно бить лицо.
Ну что ж поделать. Полечишься потом, выйдешь из больницы — а там все функциональными программистами стали!

Aleksey
11.10.2017
15:49:13
Не бывает безопасного легкого интеропа, только любые два из трёх :)

Anton
11.10.2017
15:49:21
Да и на многие ФП фичи C# запрет. Я кучу linq кода переписывал на форы с ифами, потому что никто кроме меня в офисе не умеет в ФП.

Friedrich
11.10.2017
15:50:28
Не бывает безопасного легкого интеропа, только любые два из трёх :)
Ну, у нас в F# нормальный интероп. Сам язык, возможно, не настолько безопасный, но за счёт этого он и не накладывает особенных ограничений на интероп с кодом на других языках (в т.ч. есть довольно милая модель взаимодействия с сишными библиотеками).

Google
Aleksey
11.10.2017
15:50:53
Других языков в той же экосистеме? :)

Friedrich
11.10.2017
15:51:01
Ну, сишная экосистема.

Да, это в основном заслуга рантайма, а от языка просто требуется ему не мешать.

Aleksey
11.10.2017
15:51:32
Ну и я написал же - любые два из трёх. Легко, но не безопасно

Anna
11.10.2017
15:51:38
А нету случайно чего-то типа обёртки для libclang на F#?

Friedrich
11.10.2017
15:51:41
Ок, good point.

Anna
11.10.2017
15:52:40
Слушайте, а я где-то видал.
я что-то не смогла нагуглить

Friedrich
11.10.2017
15:53:07
Не, я всё перепутал. Есть отдельно - https://github.com/atsushieno/nclang (C#, libclang) - https://github.com/fsprojects/llvm-fs (F#, LLVM)

Ну и ещё стоит упомянуть https://github.com/mono/CppSharp — он тоже за счёт clang работает.

Anna
11.10.2017
15:53:45
а, это видела, но не успела посмотреть получше. Спасибо!

Friedrich
11.10.2017
15:54:28
CppSharp я даже заводил как-то раз, но тогдашний clang у меня фейлился на каком-то хтоническом синтаксисе внутри Windows.h, так что дальше я не смог эксперименты продолжить.

Anna
11.10.2017
15:54:32
я не имею в виду F# фронтэнд для LLVM, а чтобы распарсить c-код с помощью clang и дальше работать с деревом на F#

Google
Friedrich
11.10.2017
15:55:01
Не нужно бояться библиотек на C# (и других языках)!

Один раз мне в F#-коде показалось целесообразным влезть в Microsoft.VisualBasic.FileIO :)

Anna
11.10.2017
15:57:34
у нас и так зоопарк :)

Friedrich
11.10.2017
15:57:47
(правда, код там довольно стрёмный и функции с неожиданными побочными эффектами; три из десяти, не советую ?)

Friedrich
11.10.2017
15:58:56
Если кому-то интересно, то вот этот код: https://github.com/ForNeVeR/Vacuum/blob/b716d1270ac082575ca36c0f08e8506498309f2b/Vacuum/Program.fs#L7 VisualBasic.FileIO используется для удаления файлов в виндовую корзину.

Friedrich
11.10.2017
16:25:39
Сейчас словил warning FS1183: Рекурсивная ссылка на объект "this" не используется. Наличие рекурсивных ссылок на объект увеличивает число проверок инициализации, проводимых во время выполнения для элементов этого типа и его производных типов. Рекомендуется удалить рекурсивную ссылку на объект. С одной стороны странно, конечно, видеть эти русскоязычные сообщения об ошибках — а с другой их, кажется, даже довольно прилично перевели.

Ну и сам ворнинг удивительный, да. Пойду смотреть в sharplab, чего же там такого делает этот type Xxx() as this

Мать честная, сравните: - https://sharplab.io/#v2:DYLgZgzgPg9gDgUwHYAIDKBPCAXBBbAWAChsNEUBhACgEoUBeYlZlPfAIwQCcVsALAJYQAdAFlaDFLSA - https://sharplab.io/#v2:DYLgZgzgPg9gDgUwHYAIDKBPCAXBBbAWAChsNEUBhACgEoUBDCFbACwEsmBeYlXlPfACMEAJ2bsIAOgCytFJxS0gA===

Evgeniy
11.10.2017
16:34:22
Если кто-то не видел, то вот документация. https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/members/constructors#self-identifiers-in-constructors

Хотя я заметил, что их пример не бросает предупреждение об this.X до инициализации: let x1 = this.X

Friedrich
11.10.2017
16:44:27
У кого-нибудь под рукой есть пример generative type provider? А то я пока что в документации до этого не докопался. Тот провайдер, который я сделал — кажется, erased.

Friedrich
11.10.2017
16:46:26
Старый API от нового отличается незначительно, с этим я уже разобрался (кажется).

Evgeniy
11.10.2017
16:47:00
Кажется, чтобы сделать generative достаточно флаг установить.

Friedrich
11.10.2017
16:47:08
И всё? ._.

Evgeniy
11.10.2017
16:50:38
И всё? ._.
Вот есть пример. http://blog.mavnn.co.uk/modelling-inheritance-with-inheritance/

Google
Evgeniy
11.10.2017
16:50:56
В первом листинге, 21 строка.

let t = ProvidedTypeDefinition(asm, ns, "Family", Some typeof<obj>, IsErased = false)

IsErased = false

Обманул. Еще нужны вот эти строчки: let tempAsmPath = System.IO.Path.ChangeExtension(System.IO.Path.GetTempFileName(), ".dll") let tempAsm = ProvidedAssembly tempAsmPath

И немного машинерии с ними в do-блоке.

Хороший туториал, надо бы его еще разок прочитать!

Friedrich
11.10.2017
17:03:37
Чёт у меня с generative не заладилось, кароч.

Evgeniy
11.10.2017
17:03:44
Почему?

Friedrich
11.10.2017
17:04:18
Запилил такой провайдер: https://github.com/ForNeVeR/fsharp-tp-sample/blob/master/Library.fs И вот так его пытаюсь использовать: https://github.com/ForNeVeR/fsharp-tp-sample/blob/master/example.fsx А оно мне и говорит: error FS3216: type 'StaticProperty.Provided.MyType' not found in assembly 'fsharp-tp-sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version.

Хрен его знает, что делать :(

Если то же самое сделать в erased-провайдере, то всё работает (чтоб его сделать erased, надо просто инвертировать флажки isForGenerated и isErased )

Evgeniy
11.10.2017
17:05:37
А старое API осталось?

Friedrich
11.10.2017
17:05:43
Нет.

Ну то есть, например, у ProvidedTypeDefinition теперь нет публичного конструктора.

Ты должен заменять ProvidedTypeDefinition(...) на ctxt.ProvidedTypeDefinition(...).

Evgeniy
11.10.2017
17:07:05
А посмотри, как здесь сделано.

Это какой-то древний пример от @7sharp9, который раньше падал с новым API. Но @AviAvni утверждает, что в новой версии SDK починено.

@fvnever https://github.com/AviAvni/ContextBasedGenerative/blob/2697b6ea36e350a68b1de455eb3938387bab431f/ContextBasedGenerative/TypeProvider.fs

Friedrich
11.10.2017
17:08:32
О, Ъ

Evgeniy
11.10.2017
17:11:16
Мне, кстати, новый API нравится.

Google
Friedrich
11.10.2017
17:11:29
Да он же ничем не отличается от старого.

Evgeniy
11.10.2017
17:13:54
Чудно!

Friedrich
11.10.2017
17:14:30
Блин, в неткоре даже тестировать будет сложно. FSI-то (пока что) нет.

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

Попробую, например, всегда возвращать статические байтики из готовой сборки из того метода

А потом уже будем притаскивать туда Mono.Cecil и пр.

Evgeniy
11.10.2017
17:16:37
Friedrich
11.10.2017
17:16:58
У тебя где-то припасены байтики нормальной сборки? :)
А в чём проблема? Я ж могу её тут же, в соседнем окне скомпилировать и положить на диск.

И буду всегда возвращать File.ReadAllBytes @"X:\Temp\Sborka.dll"

Evgeniy
11.10.2017
17:17:47
Валидно.

Friedrich
11.10.2017
17:21:52
А, вспомнил, что я ещё хотел. Я хотел посмотреть код этой сгенерированной сборки. Что же в ней содержится — всё-таки настоящий код или квотейшены?

Щас посмотрим!

В сборке настоящий код.

То есть вот этот квотейшен, который мы передаём в ProvidedProperty, в какой-то момент превращается в нормальный код.

Vlad
11.10.2017
17:29:03
Friedrich
11.10.2017
17:29:18
А они прям сложнее?
Нет, ненамного. Уже решили проблему.

Evgeniy
11.10.2017
17:30:06
То есть вот этот квотейшен, который мы передаём в ProvidedProperty, в какой-то момент превращается в нормальный код.
После компиляции провайдера? Я почему-то думал, что в нормальный код все превращается в сборке, где используют провайдер.

Friedrich
11.10.2017
17:30:09
Ну, у меня в глобальном смысле с ними не ладится — мы уже несколько дней обсуждаем с сообществом, как же мы будем их запускать в неткоре. Но всё будет хорошо, пока что я всё больше в этом уверяюсь. Мы справимся.

После компиляции провайдера? Я почему-то думал, что в нормальный код все превращается в сборке, где используют провайдер.
Сборка, которая возвращается из GetGeneratedAssemblyContents, в себе уже содержит настоящий код.

Google
Evgeniy
11.10.2017
17:31:38
Сборка, которая возвращается из GetGeneratedAssemblyContents, в себе уже содержит настоящий код.
Это сборка самого провайдера, или то, что отдается компилятору для встраивания генерированных типов в целевую сборку? .__.

Friedrich
11.10.2017
17:31:43
Вы вроде кидали репо со своими наработками тут?
У нас есть несколько параллельных проектов. Основной сейчас это https://github.com/Dolfik1/AssemblyGenerator Мы там делаем функцию System.Assembly -> byte[], которая бы не зависела от рантайма. Это ключевой компонент моего видения тайп-провайдеров на .NET Core.

Evgeniy
11.10.2017
17:32:39
То, что отдаётся компилятору.
Ага, а в сборке провайдера лежат quotations?

Friedrich
11.10.2017
17:32:59
В сборке провайдера лежит только код, который ты написал. Никакой магии там нет, ты ж её просто компилируешь.

Evgeniy
11.10.2017
17:33:16
Это совпадает с моим видением мира.

Friedrich
11.10.2017
17:33:21
Ну т.е. да, там лежит квотейшен, который передаётся в ProvidedProperty.

А я щас захачил GetGeneratedAssemblyContents, чтоб она мне сохраняла сгенерированную сборку (если не захачить, то компилятор её быстро удаляет, гад).

Evgeniy
11.10.2017
17:34:43
Отлично. У нас есть халявный кодогенератор.

Friedrich
11.10.2017
17:35:44
Отлично. У нас есть халявный кодогенератор.
Какой же он халявный? Только на Full CLR работает.

Evgeniy
11.10.2017
17:35:54
Привет. o/

Friedrich
11.10.2017
17:36:07
Для Standard будет нужен наш AssemblyGenerator. Вот.

Nikolay
11.10.2017
17:47:21
Тестил кто Rider? (новый)

Roman
11.10.2017
17:51:48
2017.1.2, а EAP'шка 29 сентября выходила последняя, не такой уж и новый...

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