Size: a a a

2021 January 22

O

Oleg in dlang.ru
вот так он печатает 1 2 3
   func[] cbs;
   for (int k=1; k<=3; ++k)
       (it){ cbs ~= () => it.writeln; } (k);
вот пойди, посиди и подумай
источник

DH

Dark Hole in dlang.ru
И ещё, мне кажется что кейс из примера на D каноничъно покрывается рейнджами и lazy
источник

Т

Тающий звук... in dlang.ru
То что он подставляет не значения переменных, а ссылается на них - это наверно работает из-за механизма замыканий
источник

DH

Dark Hole in dlang.ru
Другое дело что range c подвохом
источник

DH

Dark Hole in dlang.ru
Oleg
вот так он печатает 1 2 3
   func[] cbs;
   for (int k=1; k<=3; ++k)
       (it){ cbs ~= () => it.writeln; } (k);
вот пойди, посиди и подумай
В смысле "посиди, подумай"?
источник

МВ

Макс Воробьев... in dlang.ru
Oleg
вот так он печатает 1 2 3
   func[] cbs;
   for (int k=1; k<=3; ++k)
       (it){ cbs ~= () => it.writeln; } (k);
вот пойди, посиди и подумай
пример невалиден. ибо на момент вызова k = соотв 1, 2 и 3
источник

O

Oleg in dlang.ru
если оба варика работают (просто по-разному), то что невалидно то?
источник

МВ

Макс Воробьев... in dlang.ru
Oleg
если оба варика работают (просто по-разному), то что невалидно то?
во втором случае ты вызываешь лямбду сразу после изменения k
источник

МВ

Макс Воробьев... in dlang.ru
соотв нет разницы, как ты захватил k
источник

МВ

Макс Воробьев... in dlang.ru
поменялась k => вызвал k.writeln => поменялась k => вызвал k.writeln
источник

DH

Dark Hole in dlang.ru
Oleg
вот так он печатает 1 2 3
   func[] cbs;
   for (int k=1; k<=3; ++k)
       (it){ cbs ~= () => it.writeln; } (k);
вот пойди, посиди и подумай
Поправил
func[] cbs;
for (int k=1; k<=3; ++k)
   (lazy it){ cbs ~= () => it.writeln; } (k);
foreach(cb; cbs) cb();
Теперь выводит 4 4 4, как и должен
источник

O

Oleg in dlang.ru
во втором случае 2 лямбды, одну из которых ты вызываешь тут же, чтобы вторая точно запомнила 1 или 2 или 3
источник

МВ

Макс Воробьев... in dlang.ru
Oleg
вот так он печатает 1 2 3
   func[] cbs;
   for (int k=1; k<=3; ++k)
       (it){ cbs ~= () => it.writeln; } (k);
вот пойди, посиди и подумай
ааа. дошло
источник

O

Oleg in dlang.ru
изначально должен был не 4 4 4 или 3 3 3, а 1 2 3
источник

МВ

Макс Воробьев... in dlang.ru
короче - [] перед лямбдой в ++/swift - хоть и усложнено, но куда безопасней
источник

МВ

Макс Воробьев... in dlang.ru
тут есть еще момент

import std;

void main() {
   alias func = void delegate();
   func[] cbs;
   for (int k=1; k<=3; ++k)
       cbs ~= () => k = 0;
   foreach(d; cbs) d();
}
источник

МВ

Макс Воробьев... in dlang.ru
какое поведение будешь ожидать?
источник

МВ

Макс Воробьев... in dlang.ru
в общем 100500 модификаторов параметра ф-и для безопасности  добавили, а контекст захвата - нафиг не нужен)
источник

DH

Dark Hole in dlang.ru
А зачем кстати вам нужен массив лямбд создавать в цикле?
источник

Т

Тающий звук... in dlang.ru
import std;

void main() {
   alias func = void delegate();
   func[] cbs;
   auto f(int k) {
       return () => k.writeln;
   }
   for (int k=1; k<=3; ++k)
       cbs ~= f(k);
    foreach(d; cbs) d();
}
источник