前記事の 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 よりもコンスしない分だけ速い。