何の記事?
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)
※順次追加予定