Ложечки нашлись...
Jul. 10th, 2021 12:28 am... точнее, нашёлся дивный способ записать таки захват окружения в лямбде не порождая промежуточных сущностей:
Всё. Но, holy fsck, почему это не упомянуть прямо в документации? Рядом, непосредственно с. Смотрите дети: это лямбда, это кложа. Надо late binding — делай так. Надо early — i=i и получайте сколько унесёте.
> i = 42 > f = lambda x, i=i: x+i > f(0) 42 > i = 5 > f(0) 42
Всё. Но, holy fsck, почему это не упомянуть прямо в документации? Рядом, непосредственно с. Смотрите дети: это лямбда, это кложа. Надо late binding — делай так. Надо early — i=i и получайте сколько унесёте.
no subject
Date: 2021-07-09 11:07 pm (UTC)Чудесно.
Когда-то я смеялся над одним программистом, который перед каждым вызовом (речь о Си) копировал все переменные в новые переменные (будто это поможет с пойнтерами), а на входе в функцию сразу же копировал все принятые параметры в новые переменные (как будто это поможет с пойнтерами). Я сменил этого идиота, и вывесил распечатку на стене, в стиле "dailyWTF".
Правда, десять лет спустя, в Гугле, этот идиот смотрел на меня как на идиота. Ну что ж. Так устроен мир.
no subject
Date: 2021-07-09 11:17 pm (UTC)Питонисты наверное будут рассказывать что так и надо, и это изящный хак.
no subject
Date: 2021-07-10 12:16 am (UTC)no subject
Date: 2021-07-10 08:15 am (UTC)no subject
Date: 2021-07-10 10:40 am (UTC)(multiple-value-bind (incrementer decrementer) (let ((i 0)) (values (lambda () (incf i)) (lambda () (decf i)))) (print (funcall incrementer)) (print (funcall incrementer)) (print (funcall incrementer)) (print (funcall decrementer))) OUTPUT: 1 2 3 2no subject
Date: 2021-07-10 11:10 am (UTC)Вообще весь сыр-бор из за того что lambda в питоне — это expression, а не statement. Statement написать можно, как функцию, но он будет: а) неанонимен, а мне лень придумывать имена; б) тупо больше печатать.