0

nconc を使用したいくつかの実験の結果を理解するのにいくつかの問題に直面しています。

(setf x '(a b c))
(setf y '(1 2 3))

(nconc x y) ; => x = (A B C 1 2 3), y = (1 2 3)

私が読んだことから、nconc は x の残りのフィールドを y を指すように変更します。

(setf (nth 1 y) 10) ; => x = (A B C 1 10 3), y = (1 10 3)

ここまでは順調ですね。

(setf y '(4 5 6)) ; => x = (A B C 1 10 3) y = (4 5 6)

x がまだ古いコンス セルを参照しているのはなぜですか。つまり、y の再代入によって y のアドレスのデータが変更されるだけではないのですか?

前もってありがとうマイケル

4

3 に答える 3

4

Lisp 変数は固定メモリを指しません。それらはLispデータオブジェクトを指しています。変数を設定しても、オブジェクト メモリは変更されません。変数は、他のデータを指しているだけです。

于 2013-02-03T20:49:47.003 に答える
2

最後のconsインは、指していxた を指すように設定されているためです。の値を動的に、または参照によって指すことはありません。consyy

(setf x '(a b c))
; x = (a b c)
(setf y '(1 2 3))
; x = (a b c)
; y = (1 2 3)
(nconc x y)
; x = (a b c 1 2 3)
; y = (1 2 3) = (nthcdr 3 x)
(setf (nth 1 y) 10)
; x = (a b c 1 10 3)
; y = (1 10 3) = (nthcdr 3 x)
(setf y '(4 5 6))
; x = (a b c 1 10 3)
; y = (4 5 6)
于 2013-02-03T19:28:26.867 に答える
0

nconc changes the rest field of x to point to the value of y. The value y is the cell, which y points to. If you move the y pointer to another target, the rest field of x won't change, and will still point to (1 2 3).

于 2013-02-03T19:32:19.853 に答える