2

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」のどちらにもあまり運がありませんでした...。

よろしくお願いします!

4

1 に答える 1

4

VARの初期化フォームを、(make-list 10 :initial-element 0)またはなどの新しいリストを作成する式に変更します(list 0 0 0 0 0 0 0 0 0 0)

基本的に、引用符で囲まれたオブジェクトを変更する意図がある場合は、使用しないでください。変更した場合の結果は未定義です。実際、その関数定義を評価すると、次のような警告が表示されます。

; で:LAMBDA NIL
; (INCF(NTH K VAR))
; -> LET *
; ==>
; (SB-KERNEL:%SETNTH#:TMP5#:TMP4#:NEW3)
;
; 警告をキャッチ:
; 破壊関数SB-KERNEL:%SETNTHが定数データに対して呼び出されました。
; 参照:
; ANSI規格、特別オペレーターQUOTE
; ANSI規格、セクション3.2.2.3
; 
; コンパイルユニットが終了しました
; キャッチ1警告状態
于 2010-11-12T22:33:05.163 に答える