私はLispの関数にリストを渡そうとしていて、元のリストに影響を与えずに関数内のそのリストの内容を変更しようとしています。私はLispが値渡しであることを読んできました。それは本当ですが、私はそれほど理解していないことがあります。例えば、このコードは期待どおりに動作:common-lispでは、元のリストを変更せずに、関数内からリストパラメータの一部を変更するにはどうすればよいですか?
(defun test()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf n '(x y z))
n)
あなたが(テスト)を呼び出す場合は、それは(変更)にもかかわらず、(B c)は戻り(のxのy z)を印刷します。
ただし、リストの一部だけを変更しようとすると、そのようには機能しません。これは、同じ内容のコンテンツがどこにあっても同じようなものであるリストとは関係があると思いますか?ここに例があります:
(defun test()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf (first n) 'x)
n)
次に(テスト)(x b c)を印刷します。では、関数内のリストパラメータのいくつかの要素を、その関数のローカルであるかのように、どのように変更するのですか?
リテラル定数の変更の結果は未定義であることに注意してください。それをしないでください。決して。 '(a b c)はコード内のリテラル定数です。あなたはそれを変更すべきではありません。 LIST関数(list 'a' b 'c)のように作成されたリストを変更することができます。 –
注意してください(SETFオリジナル '(a b c))意味がありません。 SETFは変数を導入しません。変数 'original'はどこにも定義されていません。 LET、DEFUN、DEFVAR、DEFPARAMETERを介して導入された変数を設定することができます。 –