Lisp重新创建临时变量

Lisp重新创建临时变量,lisp,let,Lisp,Let,我有点口齿不清。我想做的是,记录一个数字在x个列表中出现的次数。但是,反复运行这个函数,lisp并没有重新创建变量,而是使用上次调用该函数时的结束值。所以我想知道我怎样才能超越let的“约束”能力 我有一些类似的清单 (((8 7) (3)) ((8 3) (2)) ((7 3) (6)) ((7 2) (8)) ((6 7) (4 1)) ((6 6) (4 1)) ((6 2) (2)) ((5 6) (3)) ((5 3) (8 3)) ((4 6) (4)) ((4 4) (

我有点口齿不清。我想做的是,记录一个数字在x个列表中出现的次数。但是,反复运行这个函数,lisp并没有重新创建变量,而是使用上次调用该函数时的结束值。所以我想知道我怎样才能超越let的“约束”能力

我有一些类似的清单

    (((8 7) (3)) ((8 3) (2)) ((7 3) (6)) ((7 2) (8)) ((6 7) (4 1))
 ((6 6) (4 1)) ((6 2) (2)) ((5 6) (3)) ((5 3) (8 3)) ((4 6) (4))
 ((4 4) (6)) ((4 1) (7)) ((3 7) (5 3)) ((3 4) (1)) ((3 3) (3)) ((3 1) (9))
 ((2 7) (7)) ((2 5) (2)) ((2 2) (5 2)) ((1 7) (1)) ((1 6) (6 1))
 ((1 1) (2 1)) ((1 0) (3)) ((0 7) (8 1)) ((0 5) (6)) ((0 3) (9 6))
 ((0 1) (1))) 
然后我调用这样的函数,(在这里声明var似乎没有任何作用,超过了初始函数调用)。。。我猜是let的某种装订

(defun counter (possibleValues)
(let ((var '(0 0 0 0 0 0 0 0 0 0)))
    (loop for i from 0 to (list-length possibleValues) do
        (loop for j in (cdr (nth i possibleValues)) do
             (loop for k in j do
              (incf (nth k var)))))
    var))
所以我可以在函数中运行我的列表

(0 8 5 6 3 2 5 2 3 2)
每个位置都参考列表中的编号。因此,值8表示在所有列表中找到1的次数(我只考虑第二个列表)。现在问题来了。。。。运行两次,然后

(0 16 10 12 6 4 10 4 6 4)
我之前使用的是关联列表,但为了解决这个问题并保持简单,我现在使用的是列表。我想我的另一个问题是,如何动态创建关联列表元素?我不喜欢这样声明“var”,但我只是想暂时避开“let”。我在“setq”或“setf”方面也没有太多运气


提前感谢您的帮助

将VAR的初始化形式更改为创建新列表的表达式,例如
(生成列表10:初始元素0)
或甚至
(列表0 0 0 0)

基本上,如果您打算修改引用的对象,请不要使用它们,因为这样做的后果是未定义的。事实上,评估该函数定义会给出以下警告:

; in: LAMBDA NIL ; (INCF (NTH K VAR)) ; --> LET* ; ==> ; (SB-KERNEL:%SETNTH #:TMP5 #:TMP4 #:NEW3) ; ; caught WARNING: ; Destructive function SB-KERNEL:%SETNTH called on constant data. ; See also: ; The ANSI Standard, Special Operator QUOTE ; The ANSI Standard, Section 3.2.2.3 ; ; compilation unit finished ; caught 1 WARNING condition ; 输入:λ零 ; (增量(第n个K变量)) ; --> 让我们* ; ==> ; (SB-KERNEL:%SETNTH#:TMP5#:TMP4#:NEW3) ; ; 捕获警告: ; 破坏性函数SB-KERNEL:%SETNTH对常量数据调用。 ; 另见: ; ANSI标准,特殊操作员报价 ; ANSI标准,第3.2.2.3节 ; ; 编译单元已完成 ; 捕获1个警告条件
您正在迭代I并使用(n次I…)访问列表???这看起来真的很糟糕。@jello接受这一正确答案是一种很好的形式:-)