4

関数内で変数の名前を使用せずに、関数内からグローバル変数の値を永続的に変更する方法を知りたいです。

(defvar *test1* 5)
(defun inctest (x) (incf x))
(inctest *test1*) ;after it runs, *test1* is still 5, not 6

これによると:

関数に渡されたオブジェクトが変更可能で、関数内でそれを変更した場合、呼び出し元と呼び出し先の両方が同じオブジェクトを参照するため、変更は呼び出し元に表示されます。

それは私が上でやっていることではありませんか?

4

4 に答える 4

2

関数にしたい場合は、グローバル変数の名前inctestを渡します。

(defun inctest (x) (incf (symbol-value x)))
(inctest '*test1*)
于 2013-10-24T08:23:22.027 に答える
2

引用符が言うことをしていません。つまり、関数に渡されたオブジェクトを変更しています。パラメータx、つまりオブジェクトのコピーを保持する関数のローカル変数を変更しています。

引用が言うことを行うには、数値の場合とは異なり、実際に変更可能なオブジェクトが必要です。リストなどの可変オブジェクトを使用すると、次のように機能します。

(defvar *test2* (list 5))
(defun inctest2 (x) (incf (car x)))
(inctest2 *test2*)
*test2* ; => (6)
于 2013-10-24T08:53:54.207 に答える
0

いいえ、それはあなたが提供したコピーを変更します。

変数自体を変更するには、その名前を使用して関数の本体で変更します。 (incf *test1*)

編集:マクロを受け入れる場合に備えて、これが私のスライムから熱くなっています:

(defmacro my-incf (variable-name)  
  `(incf ,variable-name))
于 2013-10-24T08:00:10.897 に答える