Lazy evaluation 惰性评价

Lazy evaluation 惰性评价,lazy-evaluation,Lazy Evaluation,我正在阅读哈德利·威克姆关于函数的资料,在惰性评估部分。我不明白这个例子。我搜索stackoverflow,发现有人问了一个问题。但我的问题与此不同。让我引用这一点: add <- function(x) { function(y) x + y } adders <- lapply(1:10, add) adders[[1]](10) adders[[10]](10) 因此,“y”的值似乎与“()”中的内容有关 (四) >x1添加(x1) 功能(y){ 类别(“y=,y=,x=

我正在阅读哈德利·威克姆关于函数的资料,在惰性评估部分。我不明白这个例子。我搜索stackoverflow,发现有人问了一个问题。但我的问题与此不同。让我引用这一点:

add <- function(x) {
  function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)
因此,“y”的值似乎与“()”中的内容有关

(四)

>x1添加(x1)
功能(y){
类别(“y=,y=,x=,x,”\n)
x+y
}
> 
我想知道y从哪里得到值?Thx提前。 我还定义了另一个函数,如下所示: (五)

>add2 adders2 adders2[[1]](12)
函数(z){
类别(“z=,z,“y=,y=,x=,x,”\n)
x+y+z
}
>附录2[[1]](13)
函数(z){
类别(“z=,z,“y=,y=,x=,x,”\n)
x+y+z
}
>加法器2[[2]](12)
函数(z){
类别(“z=,z,“y=,y=,x=,x,”\n)
x+y+z
}
>附录2[[2]](13)
函数(z){
类别(“z=,z,“y=,y=,x=,x,”\n)
x+y+z
}
>  
在什么条件下可以使用add2()

> add <- function(x) {
+     function(y){
+         cat("y =",y,",x =",x,"\n")
+         x + y
+     }
+ }
> adders <- lapply(1:10, add)
> adders[[1]](10)
y = 10 ,x = 10 
[1] 20
> adders[[10]](10)
y = 10 ,x = 10 
[1] 20
>
> adders <- lapply(1:17, add)
> adders[[1]](10)
y = 10 ,x = 17 
[1] 27
> adders[[10]](10)
y = 10 ,x = 17 
[1] 27
> adders[[1]](12)
y = 12 ,x = 17 
[1] 29
> adders[[1]](13)
y = 13 ,x = 17 
[1] 30
> adders[[2]](12)
y = 12 ,x = 17 
[1] 29
> adders[[2]](13)
y = 13 ,x = 17 
> x1 <- 2
> add(x1)
function(y){
        cat("y =",y,",x =",x,"\n")
        x + y
    }
<environment: 0x0000000009c90c30>
> 
> add2 <- function(x) {
+     function(y){
+         function(z){
+             cat("z =",z,"y =",y,",x =",x,"\n")
+             x + y + z
+         }
+     }
+ }
> adders2 <- lapply(1:17, add2)
> adders2[[1]](12)
function(z){
            cat("z =",z,"y =",y,",x =",x,"\n")
            x + y + z
        }
<environment: 0x0000000009da0378>
> adders2[[1]](13)
function(z){
            cat("z =",z,"y =",y,",x =",x,"\n")
            x + y + z
        }
<environment: 0x0000000009dbabf0>
> adders2[[2]](12)
function(z){
            cat("z =",z,"y =",y,",x =",x,"\n")
            x + y + z
        }
<environment: 0x0000000009dc71c0>
> adders2[[2]](13)
function(z){
            cat("z =",z,"y =",y,",x =",x,"\n")
            x + y + z
        }
<environment: 0x0000000009dd39c8>
>