Lispに少し問題があります。私がやろうとしているのは、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が見つかった回数を示します(2番目のリストのみを検討しています)。今問題....それを2回実行して...
(0 16 10 12 6 4 10 4 6 4)
以前は連想リストを使用していましたが、これを理解して物事を単純に保つために、現在はリストを使用しています。私が持っている別の質問は、どうすればその場で連想リスト要素を作成できるかということだと思います。私はそのように「var」を宣言するのは好きではありませんが、今のところ「let」を回避しようとしています。私は「setq」または「setf」のどちらにもあまり運がありませんでした...。
よろしくお願いします!