
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

Pavel
17.05.2018
09:42:50
ты еще 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 ссылка.

Roman
17.05.2018
10:38:02

Evgeniy
17.05.2018
10:43:18

Klei
17.05.2018
10:53:37

Roman
17.05.2018
10:54:37

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

Дед Пегас
17.05.2018
13:46:13

Google

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

Vlad
17.05.2018
13:47:42

Friedrich
17.05.2018
13:50:22

Vasily
17.05.2018
13:51:57

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

Evgeniy
17.05.2018
13:55:29

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

Evgeniy
17.05.2018
13:56:10

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

Evgeniy
17.05.2018
13:58:15

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

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

Google

Friedrich
17.05.2018
14:40:50

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

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
Сайм, кажется, уже слишком много прототипов наделал. :)