「対話によるCommon Lisp入門」第4話まとめノート

この章ではリストから要素を取り出す方法と,要素からリストを構築する方法について書かれている.carcdrcons の基本関数以外に,便利な関数が幾つか紹介されている.

要素の取り出し

  • first, second, …​., tenth
    第1要素から第10要素まで簡単に取りだす関数が用意されている.

  • elt Element関数はリストから任意位置の要素を取り出せる.位置のインデックスは0から数える.

> (elt '(0 1 2 3 4 5) 3)
3
  • last リストの末尾の要素を取り出す.

末尾の要素を取り出す別の方法

  • lengthelt を組み合わせる.

> (set x '(0 1 2 3 4 5))
> (elt x (- (length x) 1))
5
  • reverse で反転させて car を取る.

> (car (reverse x))
5

cons, append, list の違い.

> (cons '(a b) '(c d))
((A B) C D)
> (append '(a b) '(c d))
(A B C D)
> (list '(a b) '(c d))
((A B) (C D))

append は括弧を取るため空リスト nil は要素を成さない.

> (list '(a) '(b c) nil '(d))
((A) (B C) NIL (D))
> (append '(a) '(b c) nil '(d))
(A B C D)

リストの末尾に要素を挿入する方法

> (append '(ape bear cat) '(dog))
(APE BEAR CAT DOG)

dog が変数 x に入っている場合.

> (setf x 'dog)
> (append '(ape bear cat) (list x))
(APE BEAR CAT DOG)

butlast 関数は cdr の逆

cdr は1番目の要素を除いた残りを返すが,butlast は末尾要素を除いた残りを返す.

> (butlast '(a b c d e))
(A B C D)

butlast 関数を自分で定義するなら下のように定義できる.

> (defun my-butlast (x)
     (reverse (cdr (reverse x))))

第4話で出てきた組込み関数一覧

  • first --- car と同じ.

  • rest --- cdr と同じ.

  • first, second,…​, tenth ---1番目から10番目まで要素を簡単に取り出せる関数.

  • elt --- (elt (リスト) i) でリストのi番目の要素を取り出す関数.

  • length ---リストの長さを返す関数.

  • reverse ---リストの要素を逆順に並び替える関数.

  • last ---リストの最後の要素を返す関数.

  • append ---引数に与えられたリストを結合する関数.

  • list ---引数を要素とするリストを作成する関数.

  • butlast ---リストの最後の要素を除いた残りを返す関数.