Lisp更新列表

时间:2016-12-02 14:56:47

标签: 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")

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

2 个答案:

答案 0 :(得分:1)

如果要更新记录,可以执行以下操作:

(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

答案 1 :(得分:0)

给出你的点对列表:

_$ (setq koord '(("1" . "10,10,10") ("2" . "20,20,20") ("3" . "30,30,30")))
(("1" . "10,10,10") ("2" . "20,20,20") ("3" . "30,30,30"))

以下内容将第二项替换为新项目:

_$ (subst '("2" . "60,60,60") (assoc "2" koord) koord)
(("1" . "10,10,10") ("2" . "60,60,60") ("3" . "30,30,30"))

但请注意,这将替换所有出现的原始项目,例如:

_$ (setq koord '(("2" . "20,20,20") ("1" . "10,10,10") ("2" . "20,20,20") ("3" . "30,30,30") ("2" . "20,20,20")))
(("2" . "20,20,20") ("1" . "10,10,10") ("2" . "20,20,20") ("3" . "30,30,30") ("2" . "20,20,20"))

_$ (subst '("2" . "60,60,60") (assoc "2" koord) koord)
(("2" . "60,60,60") ("1" . "10,10,10") ("2" . "60,60,60") ("3" . "30,30,30") ("2" . "60,60,60"))