2016-12-02 93 views
0

嗨我是AutoCad lisp的新手,我试图用一些简单的例程加速我的工作,但有一点点简单,但我撞到一堵墙,无法弄清楚这一点,我有一个强大的填充,那里是个简单的解决方案。所以......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")

这时我想t O更新第二点对,让我的列表看起来像这样:

("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")

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

+0

'(list(cons“1”“10,10,10”))''的结果不是'(“1”。“10,10,10”)''' ( (“1”。 “10,10,10”))' – Sylwester

+1

而不是追加,简单地说就像这样:'(setq koord(cons(cons“2”“60,60,60”)koord))''。下一次你叫'(assoc“2”koord)',你会得到新的''(“2”。“60,60,60”)''。前一对仍然在'koord'列表中,但不会被'assoc'看到,它总是选择第一个匹配。 –

+0

你好。谢谢!我试过你的解决方案,它的工作原理 – Mario

回答

1

如果要更新的记录,你可以这样做:当您使用AutoLisp的,而不是Common Lisp的

(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") 

(注意,CL assoc使用eql在默认情况下比较,从而将返回nil(assoc "1" ...))或Emacs Lisp,我仍然建议您通过手册中的Association Lists查看。

+0

谢谢!我同时在一些论坛上可以阅读:(assoc“2”(reverse koord)) - 在我的例子中。这个“反向”将给我最后输入的一对 – Mario

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"))