2016-12-02 112 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"))