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 могло бы и триггернуть инициализацию.
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
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> ?
Google
Evgeniy
17.05.2018
14:05:30
sharplab.io не работает :(
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
Сайм, кажется, уже слишком много прототипов наделал. :)