Sponsored links

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

Sponsored links
AutoLISP
Sponsored links
Sponsored links

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は最後の要素を得る関数。