次のようなemacs lispのalistがあります。
(setq a1
'((:k1 . 1)
(:k2 . 2)
(:k3 . 3)))
のように :k1 の値を 10 に変更したい(:k1 . 10)
。それ、どうやったら出来るの?
試してみ(setf (assoc :k1 a1) '(:k1 . 10))
ました-うまくいきませんでした。
次のようなemacs lispのalistがあります。
(setq a1
'((:k1 . 1)
(:k2 . 2)
(:k3 . 3)))
のように :k1 の値を 10 に変更したい(:k1 . 10)
。それ、どうやったら出来るの?
試してみ(setf (assoc :k1 a1) '(:k1 . 10))
ました-うまくいきませんでした。
連想リストを使用すると、通常、古いコンスの前に新しいコンスを追加して、古い値を「シャドウ」します。次のようにします。
(add-to-list 'a1 '(:k1 10))
これを行うと、 (assoc :k1 a1)
10が返されます。
変更を「元に戻す」ために元assoc
の値を再度返す場合は、次のコードを使用します。
(setq a1 (delq (assoc :k1 a1) a1))
これにより、 fromの最初の一致が削除されます。:k1
a1
Emacs 25.1 の時点で、alist-get
はプレース フォームなので、次のことができます。
(setf (alist-get :k1 a1) 10)
どうですかassq-delete-all
:
(setq sql-product-alist
(cons '(ms-tsql :server ....)
(assq-delete-all 'ms-tsql sql-product-alist)))
これは、gavenkoa の提案に基づく関数です。
(defun alist-set (alist-symbol key value)
"Set KEY to VALUE in alist ALIST-SYMBOL."
(set alist-symbol
(cons (list key value)
(assq-delete-all key (eval alist-symbol)))))
利用方法 -
(let ((foo '((a 1) (b 2))))
(alist-set 'foo 'a 3)
foo) ; => ((a 3) (b 2))