連想リストのエントリの変更に問題があります。このコードを実行すると
例A
(set 'Dict '(("foo" "bar")))
(letn (key "foo"
entry (assoc key Dict))
(setf (assoc key Dict) (list key "new value")))
(println Dict)
結果は次のとおりです。
(("foo" "new value")) ; OK
これは期待されています。このコードで
例 B
(set 'Dict '(("foo" "bar")))
(letn (key "foo"
entry (assoc key Dict))
(setf entry (list key "new value"))) ; the only change is here
(println Dict)
結果は次のとおりです。
(("foo" "bar")) ; huh?
Dict
2 番目のケースで が更新されないのはなぜですか?
編集
私が望むのは、エントリがにあるかどうかを確認し、あるDict
場合は更新し、そうでない場合はそのままにしておくことです。コードの重複をletn
避けたい
(letn (key "foo"
entry (assoc key Dict))
(if entry ; update only if the entry is there
(setf entry (list key "new value")))