Andrei
Да, поэтому про с++ нельзя сказать о ленивых вычислениях
Andrei
это не функциональный язык
Алдар
хотя в руби есть ленивые вычисления
Andrei
модель с++ это последовательные вычисления
Andrei
другое дело, что на уровне компилятора есть реордеринг
Anonymous
в плюсах про ленивые можно только сказать когда идет проверка на && и все?
Andrei
и оптимизация
Алдар
вот ты написал let(:user) { create(:user) }, пока не использовал переменную user, то ничего не создаётся
Andrei
на уровне процессора есть реордеринг и branch prediction
Andrei
Andrei
Еще есть execution policy для фьючеров
Anonymous
кароче вот что я не понял
Andrei
std::launch::async \std::launch::deferred
Anonymous
Уж простите за глупые вопросы, но еще поспрашиваю
https://tour.golang.org/flowcontrol/7
(Both calls to pow are executed and return before the call to fmt.Println in main begins.)
т.е. функции выполняются заранее, еще перед тем как в main() идет их вызов?
Anonymous
В тех же плюсах, на сколько помню, функции выполняются только после их вызова, верно?
Anonymous
нет
Anonymous
там написано, что обе pow выполнятся до того, как Println будет вызвана
Anonymous
То есть, заходим в блок fmt.Println , выполняем все что внутри, и уже запускаем fmt.Println чтобы вывести эти значения
Anonymous
да
Anonymous
но это во всех языках так, кроме тех, где ленивые вычисления есть
Anonymous
А в ленивых тогда как?
Andrei
Ну человек не совсем прав.
Andrei
Но вообще в ленивых может быть так
Andrei
у тебя функция print взяла аругмент
Andrei
но на самом деле у тебя аргумент не вычислился
Andrei
до вызова функции
Anonymous
Так, да
Andrei
вместо аргумента в print передаётся указатель на отложенные вычисления
Andrei
и идёт выполнятся print
Andrei
может внутри там вообще аргумент не понадобится
Andrei
и тогда он не вычислится никогда
Andrei
в с++ аргументы функции до её вызова вычисляются всегда
Andrei
в этом смысле это всегда eager
Andrei
энергичные вычисления
Алдар
но в каком порядке не говорится
Andrei
не суть, главное, что вычисляются
Andrei
до вызова функции
Алдар
да
Andrei
в аналоге лямбда исчеления это значит, что сначала в теле лямба терма редуцируются все подтермы, а потом уже само тело лямбды
Andrei
а ленивые или их еще называют нормальные
Andrei
это когда сначала редуцируется тело лямбды, а потом уже тела её аргументов—подтермов
Andrei
Andrei
в с++ аргументы вычисляются всегда
Andrei
Ну это модель вычисления c++
Anonymous
Так вот я тупой еще раз, не могу разницу чуток понять, вот есть у print аргумент, но он не вычислен, в плюсах и go он вычисляется, и потом print их выводит, а в ленивых как
Andrei
но конечно компилятор може это поведение изменить, но так чтобы не изменилось так называемое observable behaviour
Andrei
окей
Andrei
давай поясню
Алдар
@Doaxan, попробуй хаскель поучи)
Andrei
вот у тебя есть функция
Andrei
щас про плюсы
Andrei
void foo(int arg1, bool arg2) {
if(arg2) {
arg1++;
}
}
Алдар
http://www.youtube.com/watch?v=7BPQ-gpXKt4&list=PLlb7e2G7aSpRDR44HMNqDHYgrAOPp7QLr
Andrei
Бтв
Andrei
на видео
Andrei
денис москвин
Алдар
рекомендую, заодно поймёшь откуда функциональщина вообще взялась
Andrei
чувак который у меня преподавал хаскель
Andrei
в универе
Andrei
и которому яодин из немногих сдал на отл экзамен
Алдар
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
а степик это проект универа в котором я учился :3
Andrei
энивей, про плюсы.
Anonymous
Andrei
Алдар
Я прошёл, не жалею, на многое глаза открываются)
Andrei
будет вычислять x*x в любом случае
Andrei
потом записывать на стек это значение и вызывать foo
Andrei
аналогичный код в хаскеле
Andrei
не будет вычислять x*x
Алдар
@Doaxan, откуда ты вообще эту ленивость взял?
Алдар
обычно про неё особо не знают пока хаскель не потрогают
Andrei
он сначала зайдет в foo()
Andrei
увидит, что arg2 == false
Andrei
и забъет на вычисление первого аргумента, который равен x*x
Anonymous