For loop cl循环破坏性修改cons单元

For loop cl循环破坏性修改cons单元,for-loop,lisp,common-lisp,elisp,For Loop,Lisp,Common Lisp,Elisp,我想更新cl循环构造中cons单元格的内容。例如,假设我有以下内容 (setq lst '(("a" . "b") ("c" . "d"))) (cl-loop for (k . v) in lst when (string= k "b") do (setq v "f") ; how to destructively change this? and return t) 我想我需要使用一个setcdr,但我认为这需要在不破坏结构的情况下使用循环。我怀疑我现在使用的方式是否可能

我想更新
cl循环
构造中cons单元格的内容。例如,假设我有以下内容

(setq lst '(("a" . "b") ("c" . "d")))
(cl-loop for (k . v) in lst
   when (string= k "b")
   do (setq v "f") ; how to destructively change this?
   and return t)

我想我需要使用一个
setcdr
,但我认为这需要在不破坏结构的情况下使用循环。我怀疑我现在使用的方式是否可能没有指向该对象的指针,但我不确定。

在循环中可以有多个
for
-子句:

(let ((alist (copy-tree '(("a" . "b") ("b" . "c") ("c" . "d") ("b" . "e")))))
  (cl-loop for cell in alist
           for (k . v) = cell
           when (string= k "b")
           do (setcdr cell "f")
           and return t)
  alist)
;=> (("a" . "b") ("b" . "f") ("c" . "d") ("b" . "e"))

循环中可以有多个
for
-子句:

(let ((alist (copy-tree '(("a" . "b") ("b" . "c") ("c" . "d") ("b" . "e")))))
  (cl-loop for cell in alist
           for (k . v) = cell
           when (string= k "b")
           do (setcdr cell "f")
           and return t)
  alist)
;=> (("a" . "b") ("b" . "f") ("c" . "d") ("b" . "e"))