何の記事?
Common Lispでシーケンス処理をするときのやり方を1ページでコンパクトにまとめたものです。
(という体の備忘録です。)
なるべくすぐに使えるようにするために、【Scheme手習い】みたいに対話形式で書いていきます。
詳細についてはこの記事よりはるかに詳しくまとめてある記事がたくさんあるのでそちらに譲ります。
サンプルコードの出力結果はSteel Bank Common Lisp(以下、SBCL)で実行したものです。
対象とする人
- Common Lisp始めてちょっと試してみたいって人
- これどうやってやるんだっけみたいに忘れっぽい人
- 細かいことはいいからサンプル見せてって人
シーケンス処理編
-
Q リストを処理して新しいリストを返すには?(シーケンスを
mapするには?) -
A
mapcarを使います。
mapcar.lisp
(mapcar (lambda (x) (* x 2)) '(1 2 3 4)) ; => (2 4 6 8)
-
Q リストから特定の要素のみを抜き出すもしくは排除するには?(シーケンスを
filterするには?) -
A
remove-ifもしくはremove-if-notを使います。
remove-if.lisp
(remove-if (lambda (x) (equal (mod x 2) 0)) '(1 2 3 4)) ; => (1 3)
(remove-if-not (lambda (x) (equal (mod x 2) 0)) '(1 2 3 4)) ; => (2 4)
-
Q リストを集計したり畳み込みしたりするには?(シーケンスを
reduceするには?) -
A
reduceを使います。
reduce.lisp
(reduce (lambda (m x) (+ x m)) '(1 2 3 4)) ; => 10
(reduce (lambda (m x) (+ x m)) '(1 2 3 4) :initial-value 10) ; => 20
- Q リストから重複を削除するには?
-
A
remove-duplicatesを使います。
remove-duplicates.lisp
(remove-duplicates '(1 2 2 3 4 4)) ; => (1 2 3 4)
- Q リストを逆順にするには?
-
A
reverseを使います。
reverse.lisp
(reverse '(1 2 3 4)) ; => (4 3 2 1)
- Q リストのn番目の要素がほしい。
-
Q
nthを使います。
nth.lisp
(nth 2 '(1 2 3 4)) ; => 3
- Q 二つのリストを連結したい。
-
A
appendを使います。
append.lisp
(append '(1 2 3) '(4 5)) ; => (1 2 3 4 5)
-
Q 最初の要素がほしい。(
firstがほしい) -
A
firstを使います。
first.lisp
(first '(1 2 3)) ; => 1
-
Q 最初の要素を除いたリストがほしい。(
restがほしい) -
A
restを使います。
rest.lisp
(rest '(1 2 3)) ; => (2 3)
-
Q リストの最後の要素がほしい。(
lastがほしい) -
A
lastを使いますが、リストで帰ってくる点に注意してださい。carを取るとよいでしょう。
last.lisp
(last '(1 2 3)) ; => (3)
(car (last '(1 2 3))) ; => 3
- Q 特定の長さのリストがほしい。
-
A
make-listを使います。SBCLでは:initial-elementを指定しない場合nilになります
make-list.lisp
(make-list 5) ; => (NIL NIL NIL NIL NIL)
(make-list 5 :initial-element 0) ; => (0 0 0 0 0)
※順次追加予定