Объясните ленивую причуду оценки

Я читаю книгу Хэдли Уикхемса о Github, в частностиэта часть о ленивой оценке, Там он приводит пример последствий ленивой оценки, в части сadd/adders функции. Позвольте мне процитировать этот бит:

Эта [ленивая оценка] важна при создании замыканий с lapply или циклом:

add <- function(x) {
  function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)

x лениво вычисляется при первом вызове одной из функций сумматора. На этом этапе цикл завершен, и конечное значение x равно 10. Поэтому все функции сумматора добавят 10 к своему входу, вероятно, не то, что вы хотели! Ручная принудительная оценка устраняет проблему:

add <- function(x) {
  force(x)
  function(y) x + y
}
adders2 <- lapply(1:10, add)
adders2[[1]](10)
adders2[[10]](10)

Кажется, я этого не понимаю, и объяснение здесь минимальное. Может ли кто-нибудь разработать этот конкретный пример и объяснить, что там происходит? Я определенно озадачен предложением "на этом этапе цикл завершен, и окончательное значение x равно 10" Какая петля? Какое окончательное значение, где? Должно быть что-то простое, что мне не хватает, но я просто не вижу этого. Заранее большое спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос