Friedrich
03.04.2018
15:48:49
Eugene
03.04.2018
15:48:49
Friedrich
03.04.2018
15:49:12
Vasily
03.04.2018
15:49:30
Ну вот у меня выстрелило в интересном месте
Google
Friedrich
03.04.2018
15:49:33
В целом всё так.
В случае с райдером ещё сложность в том, чтобы протащить всё из FCS в решарпер, и чтобы при этом оно не стало сильно медленнее.
Из интересных сложностей: в других языках обычно можно по синтаксису понять, во что скомпилируется декларация символа хотя бы на уровне "это будет класс" или "это будет интерфейс" и это позволяет строить кэш по синтаксическим деревьям, а потом уже поверх него и информации из сборок и другого кода можно выводить остальное, например, считать типы в методе или базовые классы. В F# же часто нельзя понять, что получится в скомпилированной сборке, и это усложняет анализ F# <-> C# в случае с решарпером и вообще интеграцию с его кэшами. Например, до резолва/вывода типов неизвестно, во что скомпилируется тип, ведь, например, атрибут [<Class>] может порезолвиться во что-нибудь другое, если его переопределить. Или нельзя синтаксически отличить Union с одним случаем и без | от аббревиатуры типы. Если делать честный резолв, то это будет крайне медленно. В Rider/VS/Ionide есть эвристики, которые работают достаточно хорошо, но их все можно сломать. Ещё из похожего, например, нельзя понять, будет ли функция из F# методом или свойством в сборке.
Проблема в выводе типов и порядке файлов. На текущий момент нельзя быстро узнать что-либо про произвольный файл, пока не пройдёт проверка типов для всех предыдущих файлов в проекте (что бывает достаточно долго), а прикрутить сюда инкрементальную инвалидацию, со слов Дона, будет довольно сложно.
Спасибо за пояснения, было интересно ознакомиться.
Vasily
03.04.2018
15:49:37
при partial apply
И данные из стрима попытались считаться в обратном порядке :)
Еще интересный факт
f a b в с# уедет как кортеж
f(a,b)
Anna
03.04.2018
15:52:18
В целом всё так.
В случае с райдером ещё сложность в том, чтобы протащить всё из FCS в решарпер, и чтобы при этом оно не стало сильно медленнее.
Из интересных сложностей: в других языках обычно можно по синтаксису понять, во что скомпилируется декларация символа хотя бы на уровне "это будет класс" или "это будет интерфейс" и это позволяет строить кэш по синтаксическим деревьям, а потом уже поверх него и информации из сборок и другого кода можно выводить остальное, например, считать типы в методе или базовые классы. В F# же часто нельзя понять, что получится в скомпилированной сборке, и это усложняет анализ F# <-> C# в случае с решарпером и вообще интеграцию с его кэшами. Например, до резолва/вывода типов неизвестно, во что скомпилируется тип, ведь, например, атрибут [<Class>] может порезолвиться во что-нибудь другое, если его переопределить. Или нельзя синтаксически отличить Union с одним случаем и без | от аббревиатуры типы. Если делать честный резолв, то это будет крайне медленно. В Rider/VS/Ionide есть эвристики, которые работают достаточно хорошо, но их все можно сломать. Ещё из похожего, например, нельзя понять, будет ли функция из F# методом или свойством в сборке.
Проблема в выводе типов и порядке файлов. На текущий момент нельзя быстро узнать что-либо про произвольный файл, пока не пройдёт проверка типов для всех предыдущих файлов в проекте (что бывает достаточно долго), а прикрутить сюда инкрементальную инвалидацию, со слов Дона, будет довольно сложно.
интересно, спасибо!
Vasily
03.04.2018
15:52:37
И обратно тоже кортежем приедет
А это засада
Friedrich
03.04.2018
15:53:06
ДЛя выражения f a b сначала будет вычислено b
Погоди, а чёт у меня не воспроизвелось:
https://sharplab.io/#v2:DYLgZgzgNALiBOBXAdgH2AUxgAgLaJgEMAjTbAD2wF5sAGAWAChMcMwwMBjGACgEpqFbAB4AtEIDU2AIwBubAAd4AS2QwwybACIApAEEtFeeSYtsYAPYWhAT0FLV6zbr3Z9hyjaaXrPNh25+AT92Ll4+PiA=
Видишь? Сначала 1, потом 2.
Artemy
03.04.2018
15:53:58
Буду рад посмотреть на репро. ;)
Ну в моём случае репро простое — создать в студии проект и открыть его (ранее я как-то уже описывал проблему; проблема была в FSharpTargetsPath — у меня вместо него Райдер пустую строку видит). Но оказалось, что это только у меня такая проблема.
Friedrich
03.04.2018
15:54:16
Artemy
03.04.2018
15:54:28
Вот те мои старые сообщения
Google
Artemy
03.04.2018
15:54:28
Поставил себе Rider (2017.2 EAP). Есть 2 вопроса/проблемы:
1) Не нашёл шаблона для F#-проекта
2) Существующий проект не открывается. Event log следующий:
22:19 Project 'ConsoleApplication1' load failed: значение "" атрибута "Project" в элементе <Import> недопустимо. Длина параметра "path" не может быть равна нулю. D:\Study\Prog\F#\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.fsproj at (69:3)
22:19 MSBuild targets were not found: Make sure that all SDKs required for projects in this solution are installed, or specify a different MSBuild version in settings.
22:19 Could not open F# project: F# SDK or project dependencies are missing. Try restoring NuGet packages; if the problem persists, please install F# SDK.
Проконсультируйте, кто может, пожалуйста. :)
P.S.: На компе уже установлена VS 2017 Community с поддержкой F#, а в настройках Rider в Build, Execution, Deployment Toolset and Build → Toolset and Build → Use MSBuild version выбрано "Auto detected (15.0)". Ну и путь — Program Files (x86)\MSBuild\15.0\bin\MSBuild.exe .
Починил и это. В файле проекта вместо <Import Project="$(FSharpTargetsPath)" /> поставил <Import Project="$(FSharpTargetsPath)" Condition="Exists('$(FSharpTargetsPath)')"/> (2-й вариант используется в файле проекта, созданном непосредственно через Rider)
Eugene
03.04.2018
15:55:05
Friedrich
03.04.2018
15:55:19
Vasily
03.04.2018
15:55:25
Каждый параметр заворачивай в fun s-> a
Friedrich
03.04.2018
15:55:49
Ты возьми f a b
Поясни? Чего взять, куда взять? Можешь в коде показать, как можно испортить?
Vasily
03.04.2018
15:55:53
Допустим
Ща
У меня просто на рабочем компе нету интернетов
ПОэтому все печально
Но попробую написать
Friedrich
03.04.2018
15:56:48
Ну мы никуда не торопимся же
Можешь написать, когда интернеты появятся :)
Дискуссия от нас никуда не убежит.
Vasily
03.04.2018
15:57:44
let f partialFunc = func s->partialFunc(s) data
Как-то так
Где data тоже 's->'a некоторый
Friedrich
03.04.2018
15:58:08
Так-с, и в этом случае что в каком порядке будет вычислено?
Google
Vasily
03.04.2018
15:58:17
Угадай :)
Точнее там (data s)
Я просто пишу адскую наркоманию
ПОка делать особо нечего, а деньги платят
Friedrich
03.04.2018
15:59:06
fun s -> partialFunc (data s)?
Artemy
03.04.2018
15:59:18
А вот сейчас я создал чистый проект "Client-Server Application" для WebSharper 4.2, исправил в файле проекта <Import Project="$(FSharpTargetsPath)" Condition="Exists('$(FSharpTargetsPath)')"/>, чтобы проект загружался (потому что до сих пор не загружается проект без правок). Он начал загружаться, но в процессе "Processing source files" вылетает ошибка:
https://i.imgur.com/BuCvdE6.png
Vasily
03.04.2018
15:59:19
partialFunc(s)
Artemy
03.04.2018
15:59:29
^ @auduchinok
Vasily
03.04.2018
15:59:54
Короче, там фишка в том, что есть функция создания объекта
Есть ридер параметров
Friedrich
03.04.2018
16:00:16
Artemy
03.04.2018
16:00:21
Vasily
03.04.2018
16:00:22
Параметры заворачиваются в функции вида 's->'a
А потом их надо зааплаить на текущую функцию
И да, я знаю, что я наркоман
Friedrich
03.04.2018
16:00:51
Vasily
03.04.2018
16:01:02
Ща фоточку пришлю
Friedrich
03.04.2018
16:01:02
Мне кажется, это окружением могло сломаться.
Eugene
03.04.2018
16:01:03
Friedrich
03.04.2018
16:01:42
(у меня в Mono ломалось постоянно из-за того, что у меня там была какая-то левота в окружении)
Google
Eugene
03.04.2018
16:01:53
Vasily
03.04.2018
16:02:21
Friedrich
03.04.2018
16:02:30
У меня вот ещё FSHARPINSTALLDIR определён на уровне системы — кажется, когда я устанавливал студию, он задефайнился
Vasily
03.04.2018
16:02:34
Короче, в лучших традициях :(
Приходится фоткой
То, что на фото, работает ок
Friedrich
03.04.2018
16:03:05
Интересный DSL'чик, кстати. Я припоминаю пару мест, где он бы пригодился.
Vasily
03.04.2018
16:03:06
Если написать однострочник, то не ок
Ну вот я его ваяю
Этот dsl
Friedrich
03.04.2018
16:03:28
Опенсурсить потом будешь?
Vasily
03.04.2018
16:03:36
Вообще планирую
В целом, он и сейчас работает
Friedrich
03.04.2018
16:03:50
А, это тот самый твой универсальный сериализатор?
Artemy
03.04.2018
16:03:54
Vasily
03.04.2018
16:03:57
Ну типа того
Friedrich
03.04.2018
16:04:19
Это интересно, мб пригодится для научных нужд. Я подумываю напилить либу для чтения VTK-формата.
https://www.vtk.org/wp-content/uploads/2015/04/file-formats.pdf вот этого
Vasily
03.04.2018
16:04:43
Ну мне там надо пару абстракция надпилить
Чтобы отвязать билдер от контекста ридера\райтера
Google
Friedrich
03.04.2018
16:05:14
Для дотнета есть либа, но она какая-то жутная
Я её попробовал заюзать в многопоточном режиме, и у меня посыпались SEH-исключения из некой mummy.dll
Тут-то я и понял, что плохо дело ?
Vasily
03.04.2018
16:05:49
:)
Ну я планирую без посторонних библиотек
Friedrich
03.04.2018
16:06:10
Ну и там у них на C++/CLI всё, с какими-то кастомными врапперами непотокобезопасными
Т.е. неткор пролетает, да и в коде никогда не разобраться
В общем, у VTK'шников фуфельно всё, надо переделывать.
Vasily
03.04.2018
16:06:48
Правда, надо понять, как снаружи принимать функцию создания объекта
Eugene
03.04.2018
16:07:03
Vasily
03.04.2018
16:07:08
С возможностью partial apply
Чтобы из C# можно было ридеры задавать
Кстати, вопрос
params c# во что в F# трансформируется?
Artemy
03.04.2018
16:08:21
Friedrich
03.04.2018
16:08:31
F# в это умеет, вроде как.
Ну а вообще-то это обычный массив, можешь ему туда массив и просунуть.
Vasily
03.04.2018
16:10:25
ParamArray подойдет в теории
Осталось понять, как его на билдер натянуть с partial apply
Friedrich
03.04.2018
16:10:43
Во, точно