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