让我们考虑一个例子:我想打开/关闭一个灯泡。在 C 中,我可以写:
struct lightbulb {
int is_turned_on;
/* from 1 to 10 */
int light_intensity;
};
每当我想打开或关闭灯泡时,我is_turned_on
通过设置light_intensity
从 1(最暗)到 10(最亮)来更改为 1 和亮度。
我如何在函数式编程中做同样的事情?我想我必须创建一个列表来保存这些值,创建一个函数ON
并OFF
“打开”/关闭灯泡,以及一个返回灯泡光强度的函数。每次调用该函数时,都会返回一个新灯泡:
(defun turn-on()
'(1 0))
(defun turn-off()
'(0 0))
(defun light-intensity (x)
`(0 ,(eval x)))
我可以看到像光强度这样的函数是一个类似于线性函数的连续函数。无论我们x
对每个 x 传递多少次相同的参数,它都会计算出相同的结果。每个功能的结果是一个具有不同状态的新灯泡。
问题是,我怎样才能坚持状态?显然,我必须通过变量将它存储在我记忆中的某个地方。
更新:我通过c2 Wiki - 函数式编程找到了上述问题的答案
数据项如何持续存在?
在堆栈上。在顺序批处理程序中,数据在顶级函数中进行初始化和转换。在像服务器这样的长期程序中,递归调用顶级循环函数,将全局状态从一个调用传递到下一个调用。
每次调用函数时我还必须创建一个新对象(列表),如何销毁之前的旧对象?
defparameter
通过and改变变量不是更有效更简单setf
吗?想象一下,如果它不是一个灯泡,而是一个包含更多信息的更复杂的物体?如何将其建模为函数?