前几天我正在阅读ChanL的来源。它包含一个使用渠道的例子来实现期货。 DEFUN在LET中声明,like so:
(let ((some-var some-value))
(defun foo () ... (reference some-var) ... )
(defun bar () ...))
这有什么用途?它只是提供一些可以共享的共同价值,并保持封装清洁吗?
答案 0 :(得分:6)
您已经回答了以下问题:为一组功能提供共享绑定并保持封装清洁。
来自http://letoverlambda.com/textmode.cl/guest/chap2.html的简单示例:
(let ((direction 'down))
(defun toggle-direction ()
(setq direction
(if (eq direction 'up)
'down
'up))))
(toggle-direction) => UP
(toggle-direction) => DOWN
(toggle-direction) => UP
(toggle-direction) => DOWN
您还可以在此闭包内添加一个函数,其行为取决于方向。
答案 1 :(得分:2)
这些只是关闭。仅针对历史背景[1],
闭包在编程风格中扮演着更加突出的角色 由Abelson和Sussman的经典结构和解释推动 计算机程序。闭包是具有本地状态的功能。该 使用此状态的最简单方法是在以下情况中:
(let ((counter 0))
(defun new-id () (incf counter))
(defun reset-id () (setq counter 0)))
这两个函数共享一个用作计数器的变量。该 第一个返回计数器的连续值,第二个返回 将计数器重置为0.同样的事情可以通过制作 对抗一个全局变量,但这样它就受到保护 无意的引用。