
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
Во, точно