- 论坛徽章:
- 0
|
1、
- 每次运行(funcall (let ((count 0)) #'(lambda () (setf count (1+ count))))) 的值都是1
复制代码
因为每次运行都得到一个新的匿名函数,它也包有一个新的环境,在该环境中,count 值为 0。
2、
- (defparameter *fn* (let ((count 0)) #'(lambda () (setf count (1+ count)))))
复制代码
以后通过 *fn* 去调用,let 只执行了一次,只有一个与 *fn* 关联的匿名函数(相应的私有空间)。
看看下面的演示
- [1]> (defparameter f (let ((count 0)) #'(lambda () (setf count (1+ count)))))F
- [2]> (defparameter g (let ((count 0)) #'(lambda () (setf count (1+ count)))))
- G
- [3]> (funcall f)
- 1
- [4]> (funcall f)
- 2
- [5]> (funcall f)
- 3
- [6]> (funcall g)
- 1
- [7]>
复制代码
f, g 的私有空间是不同的。直接 funcall let 的结果相当于每次都生成一个新函数,所以值也都是 1 了。
3、1+ 是个函数名字,这个函数接受一个参数;+ 是另外一个函数,接受 0 个或多个参数.
- > (funcall '1+ 2)
- 3
- > (funcall '+ 1 2)
- 3
- > (funcall '+ 2 1)
- 3
复制代码
(1+ count)与(+ 1 count)的结果是一样的,但调用的是不同的函数。 |
|