在LET里面的DEFUN - 为什么?

时间:2010-12-12 19:33:09

标签: common-lisp

前几天我正在阅读ChanL的来源。它包含一个使用渠道的例子来实现期货。 DEFUN在LET中声明,like so

(let ((some-var some-value))
  (defun foo () ... (reference some-var) ... )
  (defun bar () ...))

这有什么用途?它只是提供一些可以共享的共同价值,并保持封装清洁吗?

2 个答案:

答案 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.同样的事情可以通过制作   对抗一个全局变量,但这样它就受到保护   无意的引用。

Paul Graham - On lisp