每当我得到值10时,我评估以下表达式.
(((lambda (x) (lambda () (set! x (+ x 10)) x)) 0))
Run Code Online (Sandbox Code Playgroud)
但是我只是通过使用名称抽象上述过程来修改,并在每次值增加10时调用foo !!
(define foo ((lambda (x) (lambda () (set! x (+ x 10)) x)) 0))
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
您调用的函数是一个计数器,每次调用它时返回10.
在第一种情况下,每次都要创建一个新函数,然后立即调用它,然后丢弃该函数.所以每次,你第一次调用这个计数器的新实例,所以它应该返回10.
在第二种情况下,您创建一次函数并将其分配给变量并重复调用该函数.由于你正在调用相同的函数,它应该返回10,20,......