リストを Lisp の関数に渡して、元のリストに影響を与えずに関数内でそのリストの内容を変更しようとしています。Lisp は値渡しであると読んだことがありますが、それは本当ですが、よくわからないことが他にも起こっています。たとえば、次のコードは期待どおりに機能します。
(defun test ()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf n '(x y z))
n)
(test) を呼び出すと、(modify) が (xyz) を返しても (abc) が出力されます。
ただし、リストの一部だけを変更しようとすると、そのようには機能しません。これは、同じコンテンツがどこでもメモリ内で同じであるリストと関係があると思いますか?次に例を示します。
(defun test ()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf (first n) 'x)
n)
次に、(テスト) (xbc) を出力します。では、そのリストがその関数に対してローカルであるかのように、関数内のリスト パラメーターの一部の要素を変更するにはどうすればよいでしょうか?