31

次のようなemacs lispのalistがあります。

(setq a1
 '((:k1 . 1)
   (:k2 . 2)
   (:k3 . 3)))

のように :k1 の値を 10 に変更したい(:k1 . 10)。それ、どうやったら出来るの?

試してみ(setf (assoc :k1 a1) '(:k1 . 10))ました-うまくいきませんでした。

4

6 に答える 6

22

連想リストを使用すると、通常、古いコンスの前に新しいコンスを追加して、古い値を「シャドウ」します。次のようにします。

(add-to-list 'a1 '(:k1 10))

これを行うと、 (assoc :k1 a1)10が返されます。

変更を「元に戻す」ために元assocの値を再度返す場合は、次のコードを使用します。

(setq a1 (delq (assoc :k1 a1) a1))

これにより、 fromの最初の一致が削除されます。:k1a1

于 2012-04-08T13:55:05.900 に答える
14

Emacs 25.1 の時点で、alist-getはプレース フォームなので、次のことができます。

(setf (alist-get :k1 a1) 10)
于 2016-11-26T05:44:47.207 に答える
1

どうですかassq-delete-all:

(setq sql-product-alist
      (cons '(ms-tsql :server ....)
            (assq-delete-all 'ms-tsql sql-product-alist)))
于 2015-04-10T12:31:23.673 に答える
1

これは、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))
于 2015-12-11T22:36:51.027 に答える