1

重複の可能性:
LISP - 再初期化後もグローバル変数が古い値を保持する

私は現在、Lisp (Common Lisp を使用) でいくつかのコースワークを行っていますが、私が抱えているこの問題を解決する場所が他にありません。

説明するのは難しいですが、ここに行きます..

状況: 多項式である p1 と p2 という 2 つのグローバル変数があります。私の仕事は多項式計算機を作成することで、これまでのところうまくいっています。

多項式要素を特定の形式 3x^2 == ((x 2) 3) で保持し、多項式要素の両方のリストを再帰的に実行する 2 つの関数を作成しました。

3x^2 と 2x^2 を加算すると、答えは 5x^2 (または "((x 2) (3+2))") になります。

要素が計算される/計算できないときはいつでも追加される 3 番目のリスト、結果があります。

問題: 一緒に追加できる 2 つの要素を使用して、結果に追加される一時変数を作成します。ただし、何をしてもグローバル変数が変更されます。

let、lambda、さまざまな関数などを試しました。数日間立ち往生しているので、助けていただければ幸いです:)

ここに私が意味することの小さな例があります:

(setf p1 '((x 2) 2))
    ;2x^2

(setf p2 '((x 2) 3))
    ;3x^2 

(if (equal (first p1) (first p2)) 
    (progn
      (setf temp p1)
      (setf (second temp) (+ (second p1) (second p2)))
      (append-to-result temp)
      (print p1)
      (print temp)))

出力:

((×2)5)

((×2)5)

4

1 に答える 1

2

あなたがするとき:

(setf temp p1)

参照するリスト構造のコピーを作成していませんp1。両方の変数が同じコンス セルを参照するようになりました。次に、次のことを行います。

(setf (second temp) ...)

両方の変数がまだ参照しているリスト構造を変更しています。への変更:

(setf temp (copy-tree p1))
于 2013-01-04T16:17:34.573 に答える