0

こんにちは、私は 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")

この時点で、2 番目のドット ペアを更新して、リストを次のようにします。

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

では、追加するのではなく、ドット ペアの値を更新する方法や、最初の値ではなく最後に追加された値を取得する方法はありますか?

4

2 に答える 2

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 (CLassoceqlデフォルトで比較に使用するため、 for が返さnilれることに注意してください(assoc "1" ...)) または Emacs Lisp を使用していない場合でも、マニュアルの連想リストに目を通すことをお勧めします。

于 2016-12-02T15:27:52.533 に答える