【AutoLISP リスト】リストから要素を得る 関数 car cdr nth last

AutoLISP

AutoLISP 関数 car cdr

(setq Lst (list 1 2 3 4 5 4 7 8 9))

で、変数 Lst に9つの数字のリスト (1 2 3 4 5 4 7 8 9)を用意し、このリストから要素を得る方法を紹介します。

car

関数 car は、リストから1つ目の要素を取得します。

(car Lst)

では、1 が戻り値になります。
リストではなく要素だけが戻ります。

cdr

関数 cdr は、リストから1つ目の要素を取り除いた残りのリストを得ることができます。

(cdr Lst)

では、(2 3 4 5 4 7 8 9) が戻り値です。

car cdr 組み合わせた関数

2つ目以降の要素を単体で取り出したい時、car と cdrを組み合わせていきます。

2つ目は、cdr で1つ目の要素を取り除き、2つ目を一番リストの頭の要素にし、carを使います。

(car (cdr Lst))

で、2が戻り値になります。

car と cdr を合体させて1つの関数にできます。(4つまで)
例えば、関数 cadr は(car (cdr Lst))同じようにつかえて、(cadr lst) で 2 が戻ります。

(car (cdr (cdr Lst)) もしくは、(caddr Lst) では3

(car (cdr (cdr (cdr Lst)) もしくは、(cadddr Lst) では4

パターンが見えてきましたか?

間のカッコとC R 消して真ん中のa か d を残して、最初にC、最後にRを付ければ、同じ働きの関数になります。

今回はd ばかり増やしましたが、要素にリストが入っていて、car を増やしたい場合も同じです。car cdr を繰り返すときはこのパターンが使えます。
(cdr (car lst)) は、(cdar lst) と同じです。

例えば、(setq Lst (entsel)) を使い、変数Lstに
(<Entity name: x1xx2xx3xx> (13.4 15.4 0))

という図形情報を入れます。

このリストの中身は、

  • <Entity name: x1xx2xx3xx> 1つの値
  • (13.4 15.4 0) 3つの値がさらにリストになったもの

です。

さて、この (<Entity name: x1xx2xx3xx> (13.4 15.4 0)) から各値を得るは、どのようにcar cdr 組み合わせたらいいでしょうか?パズルだと思って考えてみて下さい。

答えは以下のようになります。

(car Lst) ⇒ <Entity name: x1xx2xx3xx>

(cdr Lst) ⇒ ((13.4 15.4 0))

(car (cdr Lst)) もしくは (cadr Lst) ⇒ (13.4 15.4 0)

(car (car (cdr Lst)))もしくは (caadr Lst) ⇒ 13.4

(cdr (car (cdr Lst)))もしくは (cdadr Lst) ⇒ (15.4 0)

(car (cdr (car (cdr Lst))))もしくは (cadadr Lst) ⇒ 15.4

(cdr (cdr (car (cdr Lst))))もしくは (cddadr Lst) ⇒ (0)

(car (cdr (cdr (car (cdr Lst))))) もしくは (car (cddadr Lst)) ⇒ 0
*4つまでしか合体させて1つの関数にはなりません。

ややこしいですね。
データベースとしてリストを作成する場合には、ドットペアという便利な方法もあります。

nth

関数 nth はリストの n 番目の要素を得ることができます。
順番は0から始まるので注意してください。

(nth 0 lst)

で、(car lst) と同じように、1番目の要素を取り出すことができます。

(setq Lst (list 1 2 3 4 5 4 7 8 9))

のリストから9つ目の要素を取り出したい時は、

(nth 8 lst)

で、戻り値が9になります。

先ほどの(<Entity name: x1xx2xx3xx> (13.4 15.4 0))の例だと、

(nth 0 Lst) ⇒ <Entity name: x1xx2xx3xx>

(nth 1 Lst) ⇒ (13.4 15.4 0)

(nth 0 (nth 1 Lst)) ⇒ 13.4

(nth 1 (nth 1 Lst)) ⇒ 15.4

(nth 2 (nth 1 Lst)) ⇒ 0

最初の要素を抜いた残りのリストは作れませんが、3、4番目辺りからはコチラの方がシンプルですね。

last

関数 last はリストの最後の要素を得る関数です。

(setq Lst (list 1 2 3 4 5 4 7 8 9))

のリストから最後の9を取り出したい時は、

(last lst)

で、戻り値が9になります。

まとめ

  • car はリストから1つ目の要素を得る関数。
  • cdr はリストから1つ目の要素を抜き取った残りのリストを得る関数。
  • car と cdr を組み合わせることで、リストから要素を得ることができる。
  • car と cdr を組み合わせた関数がある。
  • nth はリストからn番目の要素を得る関数。
  • nthの順番は0から始まる。(1つ目の要素は 0番目)。
  • lastは最後の要素を得る関数。