代码之家  ›  专栏  ›  技术社区  ›  Rorschach

cl循环破坏性修改cons单元

  •  0
  • Rorschach  · 技术社区  · 7 年前

    我想更新 cl-loop 建筑例如,假设我有以下内容

    (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 回复  |  直到 7 年前
        1
  •  2
  •   jkiiski    7 年前

    您可以有多个 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"))