list - Lisp 更新列表

标签 list lisp autolisp

您好,我是 AutoCad lisp 的新手,我想通过一些简单的例程来稍微加快我的工作,但我碰壁了,无法解决这个问题,我有一个强大的填充物,有一个简单的解决方案。所以……

我创建了一个名为“koord”的列表:

(setq koord (list (cons "1" "10,10,10")))

结果是点对:("1". "10,10,10")

然后我添加到这个列表中,例如:

(setq koord (append koord (list (cons "2" "20,20,20"))))
(setq koord (append koord (list (cons "3" "30,30,30"))))

现在的结果是:("1". "10,10,10") ("2". "20,20,20") ("3". "30,30,30")

此时我想更新第二个点对并使我的列表看起来像这样:

("1". "10,10,10") ("2". "60,60,60") ("3". "30,30,30")

但我不知道如何......如果我这样追加

(setq koord (append koord (list (cons "2" "60,60,60"))))

比我得到这个结果:

("1" . "10,10,10") ("2" . "20,20,20") ("2" . "60,60,60") ("3" . "30,30,30")

如果我知道如何检索这个就不会太糟糕 ("2". "60,60,60")

如果我尝试

(assoc "2" koord)

它返回第一次出现,即 ("2". "20,20,20")

那么,有没有办法不添加而是更新点对中的值,或者检索附加的最后一个 - 而不是第一个?

最佳答案

如果你想更新记录,你可以这样做:

(def alist-update (alist key value)
  "Update the value of a key or add a cell."
  (let ((cell (assoc key alist)))
    (if cell
        (setf (cdr cell) value)
        (acons key value alist))))
(setq alist (alist-update () 1 "a"))
(assoc 1 alist)
==> (1 . "a")
(setq alist (alist-update alist 1 "b"))
(assoc 1 alist)
==> (1 . "b")

虽然您使用的是 AutoLisp 而不是 Common Lisp(请注意,CL assoc 默认使用 eql 进行比较,因此会为 返回 nil(assoc "1"...)) 还是Emacs Lisp,我还是建议你看一下Association Lists在手册中。

关于list - Lisp 更新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40935069/

相关文章:

list - 适用于 2 个列表的 OCaml 代码。有没有更好的方法

python - 如何迭代一个列表的值,用函数更改它并将其添加到第二个列表?

python - 我怎样才能使用冒号(:) in variable

Java将对象存储在固定大小的集合中

python - 写 lisp 方言

autolisp - ":"和 "->"在AutoLISP中的使用

lisp - 对排序的整数列表进行分组的惯用方法?

security - Lisp 数据安全/验证

python - Lisp翻译