前記事の apply に引き続き Land of Lisp の復習から拾いメモ。
 

 
map族に mapcan というのがある。
 
こいつは
 

  1. 第1引数の関数はリストを返さなきゃいけない
  2. 返されたリストを 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 よりもコンスしない分だけ速い。
 
 
 

§1592 · Posted By · 5月 11, 2014 · Development · Tags: , , · [Print]