(defun make-prev (init-value) (let ((prev-value init-value)) (lambda () (let ((current-value prev-value)) (setf prev-value (read)) current-value))))
时间: 2024-02-22 12:57:24 浏览: 94
浩辰CAD教程之部分实用技巧-工程.doc
这是一个 Common Lisp 函数 `make-prev`,它接受一个初始值,返回一个闭包(closure)。这个闭包可以用来读入一个新的值,并返回之前输入的值。
函数的具体实现如下:
```lisp
(defun make-prev (init-value)
(let ((prev-value init-value))
(lambda ()
(let ((current-value prev-value))
(setf prev-value (read))
current-value))))
```
这个函数中有两个局部变量,`prev-value` 和闭包中的 `current-value`。`prev-value` 存储了上一次输入的值,而 `current-value` 存储了当前输入的值(在闭包中返回)。
闭包中还有一个 `setf` 表达式,它将当前输入的值存储到了 `prev-value` 中,以便下一次调用闭包时可以返回之前输入的值。
你可以使用这个函数来创建一个闭包,并且可以多次调用这个闭包来读取输入的值。例如:
```lisp
CL-USER> (setq read-prev (make-prev 0))
#<CLOSURE (:INTERNAL MAKE-PREV) {1003B7B5FB}>
CL-USER> (funcall read-prev)
1
0
CL-USER> (funcall read-prev)
2
1
CL-USER> (funcall read-prev)
3
2
```
在这个例子中,我们首先使用 `(setq read-prev (make-prev 0))` 创建了一个闭包,并将其赋值给变量 `read-prev`。然后我们调用了三次 `read-prev`,每次输入一个数字,然后闭包会返回上一次输入的数字。注意,第一次调用 `read-prev` 时,返回的是 0,因为在创建闭包时,我们将 `prev-value` 初始化为了 0。
阅读全文