引数が2つの場合:単一のシーケンス

条件式 param.Length == 2 が成立する、シーケンスを1つだけ指定した場合を考察します。

    object func = param[0];
if (param.Length == 2) {
IEnumerator i = Ops.GetEnumerator(param[1]);
while (i.MoveNext()) {
if (func == null) ret.AddNoLock(i.Current);
else ret.AddNoLock(Ops.Call(func, i.Current));
}
return ret;

変数 func は、組み込み関数 map の第1引数 function に相当する、param[0] を保持します。この関数をシーケンス内の各要素に適用します。
残りのコードの大半は、すでに紹介した IEnumerator の典型的なイディオムに従います。違いがあるとすれば、次のように、

    if (func == null) ...  // 関数を省略した None
else ... // 関数を指定した

関数 func の有無で、その後の処理を振り分けます。省略すると、各要素 i.Current をそのまま追加します。指定すると、関数を各要素に適用した結果 Ops.Call(func, i.Current) を追加します。つまり、関数 func(i.Current) を呼び出します。
次のテストケースが、このコードの意味を理解するのに役立ちます。

>>> map(None, "ABC")
['A', 'B', 'C']

第1引数 function を省略したいときには、None を指定します。すると、文字列の各要素(文字)をそのまま列挙したリストが得られます。ただし、文字列からリストを生成するだけなら、次のように、

>>> list("ABC")
['A', 'B', 'C']

組み込み関数 list を利用すると便利です。


Previous|3/5|Next