Next: Anonymous Functions, Previous: Calling Functions, Up: Functions [Contents][Index]
マップ関数(mapping
function)は与えられた関数(スペシャルフォームやマクロではない)を、リストや他のコレクションの各要素に適用します。Emacs
Lispにはそのような関数がいくつかあります。このセクションではリストにたいしてマッピングを行うmapcar
、mapc
、mapconcat
を説明します。obarray内のシンボルにたいしてマッピングを行う関数mapatoms
は、Definition of mapatomsを参照してください。ハッシュテーブル内のkey/value関係にたいしてマッピングを行う関数maphash
は、Definition of maphashを参照してください。
これらのマップ関数は文字テーブル(char-table)には適用されません。なぜなら文字テーブルは非常に広い範囲の疎な配列だからです。疎な配列であるという性質に適う方法で文字テーブルにマッピングするには、関数map-char-table
を使用します(Char-Tablesを参照)。
mapcar
は関数functionをsequenceの各要素にたいして順番に適用して、その結果をリストでリターンする。
引数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))
mapc
はmapcar
と似ているが、functionは副作用のためだけに使用される —
つまりfunctionがリターンする値は無視されてリストに収集されない。mapc
は常にsequenceをリターンする。
mapconcat
は関数functionをsequenceの各要素に適用します。結果は結合された文字列になります。結果文字列の間に、mapconcat
は文字列separatorを挿入します。separatorには通常、スペースやカンマ、あるいはその他の適切な区切り文字が含まれます。
引数functionは、1つの引数を取り文字列をreturnする関数でなければなりません。引数sequenceには、文字テーブルを除く、任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できます。
(mapconcat 'symbol-name '(The cat in the hat) " ") ⇒ "The cat in the hat"
(mapconcat (function (lambda (x) (format "%c" (1+ x)))) "HAL-8000" "") ⇒ "IBM.9111"