我在尝试实现一个计算列表中字母数的简单函数时偶然发现了这种现象。
这是代码:
(defun countit (liste)
(let* ((*dict* '((a 0)(b 0) (c 0) (d 0) (e 0) (f 0) (g 0) (h 0) (i 0)
(j 0) (k 0) (l 0) (m 0) (n 0) (o 0) (p 0) (q 0)(r 0)
(s 0) (t 0) (u 0) (v 0) (w 0) (x 0) (y 0) (z 0))))
(dolist (i liste *dict*)
(incf (second (assoc i *dict*))))))
有趣的是,如果我多次运行此功能,*dict*
会保留上次呼叫的数字。
因此,运行(countit '(a a))
然后再次(countit '(a a))
会产生(a 4)
,因此我无法理解为什么因为我为每个函数调用定义了一个本地环境,对吗?
有人可以向我解释为什么会发生这种情况以及如何在不改变它的情况下做得更好吗?