
Andrei
13.05.2016
16:10:38
Зачем ей это делать? :D

Сергей
13.05.2016
16:10:48
Бля

Andrei
13.05.2016
16:10:53
В однопоточном с++ модель вычислений строго последовательная.
И конечно в итоговом коде это не так, но да.

Google

Сергей
13.05.2016
16:11:07
Откуда ты вообще узнал про ленивые вычисления :D

Andrei
13.05.2016
16:11:21
Ленивые вычисления это совсем другое, срсли.
Это стратегия редукции лямбда термов.
В языках типа хаскелль и пр.

[Anonymous]
13.05.2016
16:11:54
вычисления следует откладывать до тех пор, пока не понадобится их результат.
это про ленивые

Andrei
13.05.2016
16:12:02
Это то как приводить программу к слабозаголовочной нормальной форме

[Anonymous]
13.05.2016
16:12:03
вот я и подумал
Ленивые вычисления (англ. lazy evaluation, также отложенные вычисления) — применяемая в некоторых языках программирования стратегия вычисления, согласно которой вычисления следует откладывать до тех пор, пока не понадобится их результат.

Aldar
13.05.2016
16:12:34
тут нет лямбдя термов))
это С++

Andrei
13.05.2016
16:12:51
Да, поэтому про с++ нельзя сказать о ленивых вычислениях
это не функциональный язык

Google

Aldar
13.05.2016
16:13:04
хотя в руби есть ленивые вычисления

Andrei
13.05.2016
16:13:14
модель с++ это последовательные вычисления
другое дело, что на уровне компилятора есть реордеринг

[Anonymous]
13.05.2016
16:13:29
в плюсах про ленивые можно только сказать когда идет проверка на && и все?

Andrei
13.05.2016
16:13:30
и оптимизация

Aldar
13.05.2016
16:13:36
вот ты написал let(:user) { create(:user) }, пока не использовал переменную user, то ничего не создаётся

Andrei
13.05.2016
16:13:56
на уровне процессора есть реордеринг и branch prediction
Еще есть execution policy для фьючеров

[Anonymous]
13.05.2016
16:15:17
кароче вот что я не понял

Andrei
13.05.2016
16:15:21
std::launch::async \std::launch::deferred

[Anonymous]
13.05.2016
16:15:40
Уж простите за глупые вопросы, но еще поспрашиваю
https://tour.golang.org/flowcontrol/7
(Both calls to pow are executed and return before the call to fmt.Println in main begins.)
т.е. функции выполняются заранее, еще перед тем как в main() идет их вызов?
В тех же плюсах, на сколько помню, функции выполняются только после их вызова, верно?
нет
там написано, что обе pow выполнятся до того, как Println будет вызвана
То есть, заходим в блок fmt.Println , выполняем все что внутри, и уже запускаем fmt.Println чтобы вывести эти значения
да
но это во всех языках так, кроме тех, где ленивые вычисления есть
А в ленивых тогда как?

Andrei
13.05.2016
16:16:28
Ну человек не совсем прав.

Google

Andrei
13.05.2016
16:16:34
Но вообще в ленивых может быть так
у тебя функция print взяла аругмент
но на самом деле у тебя аргумент не вычислился
до вызова функции

[Anonymous]
13.05.2016
16:17:05
Так, да

Andrei
13.05.2016
16:17:12
вместо аргумента в print передаётся указатель на отложенные вычисления
и идёт выполнятся print
может внутри там вообще аргумент не понадобится
и тогда он не вычислится никогда
в с++ аргументы функции до её вызова вычисляются всегда
в этом смысле это всегда eager
энергичные вычисления

Aldar
13.05.2016
16:18:01
но в каком порядке не говорится

Andrei
13.05.2016
16:18:10
не суть, главное, что вычисляются
до вызова функции

Aldar
13.05.2016
16:18:17
да

Andrei
13.05.2016
16:18:44
в аналоге лямбда исчеления это значит, что сначала в теле лямба терма редуцируются все подтермы, а потом уже само тело лямбды

[Anonymous]
13.05.2016
16:18:52

Andrei
13.05.2016
16:18:52
а ленивые или их еще называют нормальные
это когда сначала редуцируется тело лямбды, а потом уже тела её аргументов—подтермов

Google

Andrei
13.05.2016
16:19:18
в с++ аргументы вычисляются всегда
Ну это модель вычисления c++

[Anonymous]
13.05.2016
16:21:02
Так вот я тупой еще раз, не могу разницу чуток понять, вот есть у print аргумент, но он не вычислен, в плюсах и go он вычисляется, и потом print их выводит, а в ленивых как

Andrei
13.05.2016
16:21:11
но конечно компилятор може это поведение изменить, но так чтобы не изменилось так называемое observable behaviour
окей
давай поясню

Aldar
13.05.2016
16:21:25
@Doaxan, попробуй хаскель поучи)

Andrei
13.05.2016
16:21:28
вот у тебя есть функция
щас про плюсы

Admin
ERROR: S client not available

Andrei
13.05.2016
16:21:56
void foo(int arg1, bool arg2) {
if(arg2) {
arg1++;
}
}

Aldar
13.05.2016
16:22:09
http://www.youtube.com/watch?v=7BPQ-gpXKt4&list=PLlb7e2G7aSpRDR44HMNqDHYgrAOPp7QLr

Andrei
13.05.2016
16:22:23
Бтв
на видео
денис москвин

Aldar
13.05.2016
16:22:31
рекомендую, заодно поймёшь откуда функциональщина вообще взялась

Andrei
13.05.2016
16:22:38
чувак который у меня преподавал хаскель
в универе
и которому яодин из немногих сдал на отл экзамен

Google

[Anonymous]
13.05.2016
16:22:55

Aldar
13.05.2016
16:23:07
https://stepic.org/course/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0-%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5-Haskell-75/syllabus
вот его курс ещё

Andrei
13.05.2016
16:23:20
а степик это проект универа в котором я учился :3
энивей, про плюсы.

[Anonymous]
13.05.2016
16:23:41

Andrei
13.05.2016
16:23:58

Aldar
13.05.2016
16:24:02
Я прошёл, не жалею, на многое глаза открываются)

Andrei
13.05.2016
16:24:17
будет вычислять x*x в любом случае
потом записывать на стек это значение и вызывать foo
аналогичный код в хаскеле
не будет вычислять x*x

Aldar
13.05.2016
16:25:03
@Doaxan, откуда ты вообще эту ленивость взял?
обычно про неё особо не знают пока хаскель не потрогают

Andrei
13.05.2016
16:25:27
он сначала зайдет в foo()
увидит, что arg2 == false

[Anonymous]
13.05.2016
16:25:38

Andrei
13.05.2016
16:25:51
и забъет на вычисление первого аргумента, который равен x*x

[Anonymous]
13.05.2016
16:26:18

Andrei
13.05.2016
16:26:53
Мы говорим про рантайм.
foo(x*x , y);
y заранее неизвестно
плюсы всегда вычислят x*x