cl-loop破坏性地修改cons细胞

时间:2018-03-11 06:32:26

标签: for-loop lisp common-lisp elisp

我想更新cl-loop构造中的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,但想到这需要使用循环而不进行解构。我怀疑现在的方式是否可能没有得到指向该对象的指针,但我不确定。

1 个答案:

答案 0 :(得分:2)

循环中可以有多个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"))