
前記事の apply に引き続き Land of Lisp の復習から拾いメモ。
map族に mapcan というのがある。
こいつは
- 第1引数の関数はリストを返さなきゃいけない
- 返されたリストを append して返す
つまり、mapcan を無理やり mapcar を使って書くとこうなる。
;; mapcan の動作を再現
(apply #'append
(mapcar (lambda (x)
(if (zerop x)
nil
(list x)))
'(1 0 2 0 3 0 4)))
(1 2 3 4)
;; 0 -> nil -> append でなかったことになってる
次に、mapc について。
こいつは副作用しか欲しくない時に使う。
副作用をひと通り実行した後、mapc 自体が返すのは元のリストだ。
(mapc (lambda (x)
(format t "This list has ~A~%" x))
'(1 2 3 4))
This list has 1
This list has 2
This list has 3
This list has 4
(1 2 3 4)
mapc は第1引数の関数内でやったことを元に新しいリストをコンスしない。
だから(もう一回言うけど)副作用にだけ興味が有るときは mapcar よりもコンスしない分だけ速い。
