mapcar, mapcan, mapcの違いについて

Common Lispにはリストのエレメントに関数をマッピングする関数が複数存在する。 今回はその中でもよく使う三つの関数 mapcar、mapc、mapcan の違いについて解説していきます。

  1. mapcar

    mapcarは第一引数の関数を第二引数以降のリストに適用することができます。 上記の例では数字のリストを二乗しています。戻り値としてラムダ関数を適用したリストが返されています。 また、関数が複数の引数を受け取る場合、下記のように複数のリストを記載します。

  2. mapc

    mapc は mapcar とは違い、関数を適用したリストを返さずに、元のリストを返します。 上記の例ではリストに含まれている名前を princ で出力しています。引数として使用したリストがそのまま戻り値として返されています。 mapcは副作用だけが欲しい場合に使用します。mapcarと比較すると新しいリストをconsで作成する処理がないため、高速です。

  3. mapcan

    mapcan は第一引数の関数が返すリストを nconc でつなげていきます。 mapcar は関数が返したリストをネストして追加しているのに対し、mapcan はリストをネストせずにつなげ合わせています。

参考
CLHS: Function MAPC, MAPCAR, MAPCAN, MAPL...