Next: , Previous: , Up: 関数   [Contents][Index]


13.6 関数のマッピング

マップ関数(mapping function)は与えられた関数(スペシャルフォームやマクロではない)をリストや他のコレクションの各要素に適用します。Emacs Lispにはそのような関数がいくつかあります。このセクションではリストにたいしてマッピングを行うmapcarmapcmapconcatmapcanを説明します。obarray内のシンボルにたいしてマッピングを行う関数mapatomsDefinition of mapatomsを参照してください。ハッシュテーブル内のkey/value関係にたいしてマッピングを行う関数maphashDefinition of maphashを参照してください。

これらのマップ関数は文字テーブル(char-table)には適用されません。なぜなら文字テーブルは非常に広い範囲の疎な配列だからです。疎な配列であるという性質に適う方法で文字テーブルにマッピングするには、関数map-char-tableを使用します(文字テーブルを参照)。

Function: mapcar function sequence

mapcarは関数functionsequenceの各要素にたいして順番に適用して、その結果をリストでリターンする。

引数sequenceには、文字テーブルを除く任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できる。結果は常にリストになる。結果の長さはsequenceの長さと同じ。たとえば:

(mapcar #'car '((a b) (c d) (e f)))
     ⇒ (a c e)
(mapcar #'1+ [1 2 3])
     ⇒ (2 3 4)
(mapcar #'string "abc")
     ⇒ ("a" "b" "c")

;; my-hooks内の各関数を呼び出す
(mapcar 'funcall my-hooks)

(defun mapcar* (function &rest args)
  "Apply FUNCTION to successive cars of all ARGS.
Return the list of results."
  ;; リストが消費されていなければ
  (if (not (memq nil args))
      ;; CARに関数を適用する
      (cons (apply function (mapcar #'car args))
            (apply #'mapcar* function
                   ;; 残りの要素のための再帰
                   (mapcar 'cdr args)))))

(mapcar* #'cons '(a b c) '(1 2 3 4))
     ⇒ ((a . 1) (b . 2) (c . 3))
Function: mapcan function sequence

この関数はmapcarのようにsequenceの各要素にfunctionを適用するが、結果をリストに収集するかわりに結果を変更(nconcを使用。see リストを再配置する関数を参照)して結果のすべての要素を単一のリストでリターンする。mapcarと同様にsequenceには文字テーブルを除く任意のタイプのシーケンスを指定できる。

;; 以下と:
(mapcar #'list '(a b c d))
     ⇒ ((a) (b) (c) (d))
;; 以下を比較してみよ:
(mapcan #'list '(a b c d))
     ⇒ (a b c d)
Function: mapc function sequence

mapcmapcarと似ているが、functionは副作用のためだけに使用される — つまりfunctionがリターンする値は無視されてリストに収集されない。mapcは常にsequenceをリターンする。

Function: mapconcat function sequence separator

mapconcatsequenceのそれぞれの要素にfunctionを適用する。結果は文字のシーケンス(文字列、ベクター、リスト)でなければならず、単一の文字列に結合されてリターン値となる。mapconcatは結果シーケーンスの各ペアの間にseparatorの文字を挿入する。これも文字列、または文字のベクターかリストでなければならない。シーケンス、配列、ベクターを参照のこと。

引数functionは1つの引数を受け取り文字のシーケンス、すなわち文字列、ベクター、リストのいずれかをリターンする。引数sequenceは文字テーブル以外の任意の種類のシーケンス、すなわちリスト、ベクター、ブールベクター、または文字列を指定できる。

(mapconcat #'symbol-name
           '(The cat in the hat)
           " ")
     ⇒ "The cat in the hat"

(mapconcat (lambda (x) (format "%c" (1+ x)))
           "HAL-8000"
           "")
     ⇒ "IBM.9111"