[personal profile] ex0_planet
... точнее, нашёлся дивный способ записать таки захват окружения в лямбде не порождая промежуточных сущностей:
> i = 42
> f = lambda x, i=i: x+i
> f(0)
42
> i = 5
> f(0)
42

Всё. Но, holy fsck, почему это не упомянуть прямо в документации? Рядом, непосредственно с. Смотрите дети: это лямбда, это кложа. Надо late binding — делай так. Надо early — i=i и получайте сколько унесёте.

Date: 2021-07-09 11:07 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Чудесно.

Когда-то я смеялся над одним программистом, который перед каждым вызовом (речь о Си) копировал все переменные в новые переменные (будто это поможет с пойнтерами), а на входе в функцию сразу же копировал все принятые параметры в новые переменные (как будто это поможет с пойнтерами). Я сменил этого идиота, и вывесил распечатку на стене, в стиле "dailyWTF".

Правда, десять лет спустя, в Гугле, этот идиот смотрел на меня как на идиота. Ну что ж. Так устроен мир.

Date: 2021-07-10 12:16 am (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Интересно, как выразить создание двух лямбд, разделяющих общую переменную i ?
Edited Date: 2021-07-10 12:16 am (UTC)

Date: 2021-07-10 10:40 am (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Я имел в виду, можно ли в Python аналог такого:

(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
2




Edited Date: 2021-07-10 10:42 am (UTC)

Profile

ex0_planet

April 2023

S M T W T F S
      1
234567 8
910111213 1415
16171819202122
23242526272829
30      

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 25th, 2026 02:22 am
Powered by Dreamwidth Studios