从lisp(elisp)中的关联列表中弹出元素

pyg*_*iel 5 lisp emacs elisp

我正在寻找一种从关联列表中"弹出"元素的方法,换句话说就是"破坏性"的关联:

(setq alist '((a . 1) (b . 2))
(assoc-pop 'a alist) ;; -> (a . 1)
;; alist -> ((b . 2))
Run Code Online (Sandbox Code Playgroud)

在elisp线束中有任何功能吗?获得symilar功能最优雅的方法是什么?(不确定这种"副作用"是一种很好的做法,即使有可能!)

Sva*_*nte 3

据我所知,没有这样的内置运算符,但我认为您可以很快获得此功能:

(defmacro assoc-pop (key alist)
  `(let ((result (assoc ,key ,alist)))
     (setq ,alist (delete result ,alist))
     result))
Run Code Online (Sandbox Code Playgroud)