## Tcl8.6.17/Tk8.6.17 Documentation > Tcl Commands > lmap

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

### NAME

lmap — 一つ或はそれ以上のリストの全ての要素に亙って巡回し結果を集める Iterate over all elements in one or more lists and collect results

### 構文 SYNOPSIS

lmap varname list body
lmap varlist1 list1 ?varlist2 list2 ...? body

### 説明 DESCRIPTION

lmap 命令は､繰返しを実装する､そこでは､繰返し用変数が､一つ或はそれ以上のリストから値を受け出し､繰返しが毎回の巡行から集めた結果を返す｡ [訳註 本命令は8.6版から導入された｡8.5版では apply 命令の用例の項に擬似命令 map が例示されている｡] 　　　 The lmap command implements a loop where the loop variable(s) take on values from one or more lists, and the loop returns a list of results collected from each iteration.

最も簡単な場合は繰返し変数 varname 一つとその varname に代入する値のリスト list 一つとを有する｡ body 引数は Tcl 記述譜である｡ lmap は､ list のそれぞれの要素について(最初から最後の順に)､恰も要素を抽出する為に使い慣れた lindex 命令の様に､要素の内容を varname に代入する､次に､ body を実行する為に Tcl 解釈実行機能を呼ぶ｡もし本体の実行が通常通り完了すると､本体の結果は累積リストに追記される｡ lmap は累積リストを返す｡ 　　　 In the simplest case there is one loop variable, varname, and one list, list, that is a list of values to assign to varname. The body argument is a Tcl script. For each element of list (in order from first to last), lmap assigns the contents of the element to varname as if the lindex command had been used to extract the element, then calls the Tcl interpreter to execute body. If execution of the body completes normally then the result of the body is appended to an accumulator list. lmap returns the accumulator list.

一般の場合､一つではなく多くの値のリストがあってもよく(譬えば､ list1 と list2)､又､それぞれの値のリストは繰返し変数のリストに結合できる(譬えば､ varlist1 と varlist2)｡繰返しの毎回の反復の間､それぞれの varlist の変数は対応するリストから一貫した値が代入される｡それぞれの list の値は初めから最後の順に使用され､それぞれの値は厳密に一度使用される｡繰返し反復の総数は全ての値のリストから全ての値を使用しきるに充分な大きさである｡もし､それぞれの反復のそれぞれの繰返し変数に対して､値リストが充分な要素を含んでいない場合､失われた要素に対して空値が使用される｡ [訳註 説明文のこの箇所は foreach 命令と同一文章｡]　　　 In the general case there can be more than one value list (e.g., list1 and list2), and each value list can be associated with a list of loop variables (e.g., varlist1 and varlist2). During each iteration of the loop the variables of each varlist are assigned consecutive values from the corresponding list. Values in each list are used in order from first to last, and each value is used exactly once. The total number of loop iterations is large enough to use up all the values from all the value lists. If a value list does not contain enough elements for each of its loop variables in each iteration, empty values are used for the missing elements.

break か continue 文が body の内部で起動された場合､ for や foreach 命令の場合と同じ効果を表す｡この様な場合本体は正常には完了せず､結果は累積リストに追記されない｡ The break and continue statements may be invoked inside body, with the same effect as in the for and foreach commands. In these cases the body does not complete normally and the result is not appended to the accumulator list.

### 用例 EXAMPLES

リストを互いに噛合わせる: Zip lists together:

    set list1 {a b c d}
    set list2 {1 2 3 4}
    set zipped [lmap a $list1 b $list2 {list $a $b}]
    # 噛合せられた値は "{a 1} {b 2} {c 3} {d 4}"
    # The value of zipped is "{a 1} {b 2} {c 3} {d 4}"

リストから奇数の値を篩い落す: 　　　 Filter a list to remove odd values:

    set values {1 2 3 4 5 6 7 8}
    proc isEven {n} {expr {($n % 2) == 0}}
    set goodOnes [lmap x $values {expr {
        [isEven $x] ? $x : [continue]
    }}]
    # 選抜した値は "2 4 6 8"
    # The value of goodOnes is "2 4 6 8"

リストの内容に基き､リストの前置辞を取出す: 　　　　 Take a prefix from a list based on the contents of the list:

    set values {8 7 6 5 4 3 2 1}
    proc isGood {counter} {expr {$n > 3}}
    set prefix [lmap x $values {expr {
        [isGood $x] ? $x : [break]
    }}]
    # 前置辞の値は "8 7 6 5 4"
    # The value of prefix is "8 7 6 5 4"

### SEE ALSO

break, continue, for, foreach, while

### KEYWORDS

foreach, iteration, list, loop, map
Copyright © 2012 Trevor Davel