
Friedrich
11.10.2017
15:48:51

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

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

Friedrich
11.10.2017
15:50:28

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
(правда, код там довольно стрёмный и функции с неожиданными побочными эффектами; три из десяти, не советую ?)

Пир
11.10.2017
15:58:04

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

Anna
11.10.2017
16:15:10

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.

Evgeniy
11.10.2017
16:44:49

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

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

Google

Vlad
11.10.2017
17:30:41

Evgeniy
11.10.2017
17:31:38

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

Vlad
11.10.2017
17:32:24

Evgeniy
11.10.2017
17:32:39

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

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 сентября выходила последняя, не такой уж и новый...