Wyjaśnij dziwaczną ocenę

W szczególności czytam książkę Hadleya Wickhamsa o Githubieta część leniwej oceny. Tam podaje przykład konsekwencji leniwej oceny, w części zadd/adders Funkcje. Pozwólcie, że zacytuję ten fragment:

Ta [leniwa ocena] jest ważna przy tworzeniu zamknięć za pomocą lapply lub pętli:

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

x jest leniwie oceniany przy pierwszym wywołaniu jednej z funkcji sumatora. W tym momencie pętla jest kompletna, a końcowa wartość x wynosi 10. Dlatego wszystkie funkcje sumatora dodadzą 10 do swoich danych wejściowych, prawdopodobnie nie tego, czego chcesz! Ręczne wymuszanie oceny rozwiązuje problem:

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

Wydaje mi się, że nie rozumiem tego, a wyjaśnienie tam jest minimalne. Czy ktoś mógłby opracować ten konkretny przykład i wyjaśnić, co się tam dzieje? Zdumiewa mnie zdanie „w tym momencie pętla jest kompletna, a końcowa wartość x wynosi 10”. Jaka pętla Jaka jest ostateczna wartość? To musi być coś prostego, którego mi brakuje, ale po prostu tego nie widzę. Z góry dziękuję.

questionAnswers(2)

yourAnswerToTheQuestion