@Fsharp_chat

Страница 574 из 772
Vasily
17.05.2018
09:13:29
Один раз при инициализации

Судя по всему, статический конструктор там внутри

Evgeniy
17.05.2018
09:14:11
Нет, сложнее.

Vasily
17.05.2018
09:14:24
Ну ща попробуем в отдельном файле

Google
Vasily
17.05.2018
09:16:43
Хммм... очень странная история, действительно

Evgeniy
17.05.2018
09:16:49
На каждый файл существует статический инициализатор, который вызывается по правилам, описанным в пункте 12.5.1 спеки. В этот инициализатор, например, попадают инициализация let и тело do.

А правила порой довольно хитрые. Вот одно из них: - the static initializer for the file is executed on first access of a value that has observable initialization according to the rules that follow

Хитрость в has observable initialization.

То есть обращение к обычным значениям, связанным через let в модуле, не будет вызывать do модуля.

Vasily
17.05.2018
09:18:18
В общем, если в отдельном файле, то do не выполняется само

Evgeniy
17.05.2018
09:18:30
Я, пожалуй, всю спеку сюда не буду копировать.

Vasily
17.05.2018
09:19:09
Да у меня открыта, страницу скажи

Evgeniy
17.05.2018
09:19:18
226

С таким поведение инициализаторов, кстати, связана необходимость писать точку доступа для проектов с тестами.

Иначе инициализация расшаренных между тестами значений просто не выполняется.

Vasily
17.05.2018
09:22:49
Чет ничего не понимаю. Поведение мегастранное

Google
Vasily
17.05.2018
09:23:10
do вообще игнорируется

Хотя инициализация модуля прошла

Evgeniy
17.05.2018
09:23:35
Vasily
17.05.2018
09:24:06
[<AutoOpen>] module Test= do printfn "Hello world" let x=42

Evgeniy
17.05.2018
09:24:24
Я же написал.

Хитрость в has observable initialization.

То есть обращение к обычным значениям, связанным через let в модуле, не будет вызывать do модуля.

Vasily
17.05.2018
09:24:41
Так

Теперь вопрос, можно ли этого добиться

Pavel
17.05.2018
09:33:26
https://ideone.com/eRwi67

Evgeniy
17.05.2018
09:34:14
неверю
Это поведение тоже описывается правилами из 12.5.1.

Vasily
17.05.2018
09:35:23
https://ideone.com/eRwi67
А теперь вжух - и вынеси модуль в отдельный файл

Pavel
17.05.2018
09:42:50
А теперь вжух - и вынеси модуль в отдельный файл
[<AutoOpen>] module Test = let mutable x = 0 do x <- 42 printfn "Hello world"

ты еще Clean не видел. там вооще угадать что выполниться было нераельно

Vasily
17.05.2018
09:44:47
Хммм... на присвоении сработало

Ужоснах

Evgeniy
17.05.2018
09:46:59
Ужоснах
А что ты делаешь, что тебе нужны сайдэффекты при обращении к константам?

Vasily
17.05.2018
09:52:56
Да я так, размышляю , как правильно написать менеджер сессий

Evgeniy
17.05.2018
09:53:55
Звучит как задача для объектов.

Google
Vasily
17.05.2018
09:55:02
Pavel
17.05.2018
10:15:18
причем тут do в модулях?

Evgeniy
17.05.2018
10:23:36
// f# 4.1 [<Struct>] type S(x: int, y: int) = member __.X = x member __.Y = y member this.Replace(s: S) = this <- s // wtf?

Pavel
17.05.2018
10:31:23
что это?

Evgeniy
17.05.2018
10:32:23
Странный код, который сейчас почему-то компилируется.

В F# 4.5 перестанет, потому что this будет иметь тип inref<T>, а это read-only ссылка.

Evgeniy
17.05.2018
10:43:18
А в рантайме работает?
Он ничего полезного не делает. :)

Roman
17.05.2018
10:54:37
Он ничего полезного не делает. :)
Ну можно же заменить S, довольно полезно)

Evgeniy
17.05.2018
10:57:17
https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1053-span.md

Roman
17.05.2018
11:33:16
https://github.com/nosami/Elmish.Calculator/blob/master/Elmish.Calculator/Calculator.fs#L38 две ф-ции calculate!

а там шэдоинг

Alex
17.05.2018
12:01:52
оО как это

Evgeniy
17.05.2018
12:06:19
https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1054-undent-list-args.md

?

Pavel
17.05.2018
12:09:29
Elmish двигает язык)

Friedrich
17.05.2018
13:44:01
А ещё Мартин (автор скалы) недавно выступал на dconf
А Александреску выступал на dotnext!

Дед Пегас
17.05.2018
13:46:13
Google
Дед Пегас
17.05.2018
13:46:17
D#

Vlad
17.05.2018
13:47:42
А Александреску выступал на dotnext!
я прям как в универ сходил на его докладе

Friedrich
17.05.2018
13:50:22
Судя по всему, статический конструктор там внутри
Зависит от того, библиотека у тебя или исполняемый файл!

[<AutoOpen>] module Test= do printfn "Hello world" let x=42
Ага-ага, обращение снаружи к let x = 42 не триггернёт статический инициализатор. Это форменный кошмар, да. И поэтому лучше не иметь побочных эффектов в инициализаторах модулей.

Vasily
17.05.2018
13:51:57
Зависит от того, библиотека у тебя или исполняемый файл!
Вообще поведение там несколько недетерменированно

Friedrich
17.05.2018
13:52:16
А если б ты там написал код посложнее, чем просто 42, то обращение к x могло бы и триггернуть инициализацию.

Admin


Friedrich
17.05.2018
13:53:57
Evgeniy
17.05.2018
13:55:29
Вообще поведение там несколько недетерменированно
Детерминировано и описано в спеке.

Friedrich
17.05.2018
13:55:48
D#
Между прочим, было бы очень интересно взглянуть на такую реализацию. Managed C, который у меня в загашнике лежит, выглядит намного скучнее!

Evgeniy
17.05.2018
13:56:10
Там всё очень контринтуитивно.
Разве у C# не похожее поведение в статических классах со статическим конструктором и константами?

Vlad
17.05.2018
13:56:21
ты даже реализацию недоделанную нашел

Evgeniy
17.05.2018
13:58:15
Friedrich
17.05.2018
13:59:58
Разве у C# не похожее поведение в статических классах со статическим конструктором и константами?
Похожее, но менее контринтуитивное, на мой взгляд. У нас накладываются ещё хитрости с библиотечными и исполняемыми проектами, которые всё путают ещё сильнее.

А что этот код делает?
В C# можно написать внутри метода структуры this = smth;, и такой код делает ровно то, что ожидается — заменяет все поля текущего экземпляра новыми значениями. (не уверен, работает ли это для структур с ридонли полями)

Ни разу не видел, чтобы эту конструкцию кто-то использовал в настоящем коде.

Evgeniy
17.05.2018
14:01:44
Ок, я просто не могу получить такое же поведение в F#. Хотя, казалось бы, val this : byref<S> ?

Google
Evgeniy
17.05.2018
14:05:30
sharplab.io не работает :(

Friedrich
17.05.2018
14:40:50
sharplab.io не работает :(
Напиши https://twitter.com/ashmind

Nikolay
17.05.2018
14:47:02
Evgeniy
17.05.2018
14:47:18
И через впн?
Причем тут впн? Он просто лежит.

Nikolay
17.05.2018
14:47:32
Алло, пора привыкнуть

Evgeniy
17.05.2018
14:47:41
Нет.

Он открывается, но не хочет компилировать мой код.

Vladimir
17.05.2018
15:38:14
а что #region и #endregion не работает и никакой замены нет?

Friedrich
17.05.2018
15:46:51
?‍?
17.05.2018
15:50:02
https://stackoverflow.com/a/9928028/2684760
И кто-то так делает? Оо

Friedrich
17.05.2018
15:50:14
Ни разу не видел.

Vladimir
17.05.2018
15:52:53
Evgeniy
17.05.2018
16:52:09
https://twitter.com/jaredpar/status/997132778641604608

https://twitter.com/JetBrainsRider/status/997163033192550401

Elmish двигает язык)
Ну да, мелкие, но приятные фичи. https://github.com/Microsoft/visualfsharp/pull/4930

Сайм, кажется, уже слишком много прототипов наделал. :)

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