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

### 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

coroutine, yield, yieldto — コルーチンから値を創製作成する Create and produce values from coroutines

### SYNOPSIS

coroutine name command ?arg...?
yield ?value?
yieldto command ?arg...?
name ?value...?

### 説明 DESCRIPTION

coroutine 命令は name と謂う名前の新しい(命令に結合した)コルーチン文脈を生成し､ command の 呼出しにより､残りのその他の引数を更に解釈することなく渡しながらその文脈を実行する｡一たび､ command が正常に戻るか､例外(譬えば､不都合)を伴って戻ると､コルーチン文脈の name は削除される｡　　　　　　　 The coroutine command creates a new coroutine context (with associated command) named name and executes that context by calling command, passing in the other remaining arguments without further interpretation. Once command returns normally or with an exception (e.g., an error) the coroutine context name is deleted.

文脈内部では､ yield 命令を使った結果として値が生成されてもよい; value が何も与えられない場合は空文字列が使われる｡呼出されると､その文脈は実行が棚上げされ､ coroutine 命令は引数を yield に返す｡文脈の実行は､文脈の命令を呼ぶことにより再開することができる､更に､文脈の棚上げを引起した yield 呼出しの結果として､使用すべき一つの値を渡すこともできる｡もしコルーチン文脈が yield を全く行わず､通常の方法で帰る場合は､その文脈の評価結果がその coroutine 命令の結果になる｡　　　　　 Within the context, values may be generated as results by using the yield command; if no value is supplied, the empty string is used. When that is called, the context will suspend execution and the coroutine command will return the argument to yield. The execution of the context can then be resumed by calling the context command, optionally passing in the single value to use as the result of the yield call that caused the context to be suspended. If the coroutine context never yields and instead returns conventionally, the result of the coroutine command will be the result of the evaluation of the context.

コルーチンは yieldto 命令の使用によっても実行が棚上げされる､その命令は戻る代りに､(コルーチンの文脈で決定された) command と呼ばれる命令に実行を譲り､それに幾つでも引数が手渡される｡全てのコルーチンは文脈命令を有するので､ yieldto は一つのコルーチンから別のコルーチンに制御を直接移転する為に使用でき(もし二つのコルーチンがその事態を予測している場合にのみ価値がある)､どのような命令も目標になりうる｡もしコルーチンがこの仕組みによって実行棚上げされている場合､そのコルーチンの処理は文脈命令の呼出により再開でき､指定すれば､任意個数の引数を手渡せる｡ yieldto 呼出しの返り値は文脈命令に渡した引数のリストである; それらの値で何を行うか決定することは呼出し側の責務である｡　　　　　　　　　　 The coroutine may also suspend its execution by use of the yieldto command, which instead of returning, cedes execution to some command called command (resolved in the context of the coroutine) and to which any number of arguments may be passed. Since every coroutine has a context command, yieldto can be used to transfer control directly from one coroutine to another (this is only advisable if the two coroutines are expecting this to happen) but any command may be the target. If a coroutine is suspended by this mechanism, the coroutine processing can be resumed by calling the context command optionally passing in an arbitrary number of arguments. The return value of the yieldto call will be the list of arguments passed to the context command; it is up to the caller to decide what to do with those values.

多重の引数を伴って再開を許可する yield の版を書く推奨方法は、このように、 yieldto および return 命令を使用して､この様に: 　　　　 The recommended way of writing a version of yield that allows resumption with multiple arguments is by using yieldto and the return command, like this:

    proc yieldm {value} {
        yieldto return -level 0 $value
    }

コルーチンは命令の名前 name を破棄することによっても削除され､又､現在のコルーチンの名前は info coroutine によって取出せる｡もし､コルーチンの実装内の変数の削除の追跡がある場合は､コルーチンが明示的に削除される時点で(又はより自然に､その命令が通常の方法で返った場合)､それらは開始されることになる｡ The coroutine can also be deleted by destroying the command name, and the name of the current coroutine can be retrieved by using info coroutine. If there are deletion traces on variables in the coroutine's implementation, they will fire at the point when the coroutine is explicitly deleted (or, naturally, if the command returns conventionally).

command が呼出された時点で､現在の名前空間は大域名前空間であり､そこには( upvar と uplevel の様な)棚枠はない｡しかし､コルーチン命令が呼出された名前空間の中で､どの命令を呼出すべきかが決定されることになる｡ 　　　 At the point when command is called, the current namespace will be the global namespace and there will be no stack frames above it (in the sense of upvar and uplevel). However, which command to call will be determined in the namespace that the coroutine command was called from.

### 用例 EXAMPLES

この例は､無限の偶数列の並びの生成と､その初めの１０個を消費する繰返しのコルーチンを示す｡ 　　 This example shows a coroutine that will produce an infinite sequence of even values, and a loop that consumes the first ten of them.

    proc allNumbers {} {
        yield
        set i 0
        while 1 {
            yield $i
            incr i 2
        }
    }
    coroutine nextNumber allNumbers
    for {set i 0} {$i < 10} {incr i} {
        puts "received [nextNumber]"
    }
    rename nextNumber {}

この例では､コルーチンは渡された引数まで加えるように活動する｡ 　　 In this example, the coroutine acts to add up the arguments passed to it.

    coroutine accumulator apply {{} {
        set x 0
        while 1 {
            incr x [yield $x]
        }
    }}
    for {set i 0} {$i < 10} {incr i} {
        puts "$i -> [accumulator $i]"
    }

この例では､素数を見つける為の古典的なエラストネスの篩の算法を実現する為のコルーチンの使用を実証する｡註意すべきは､コルーチン内部のコルーチン作成である｡ 　　　 This example demonstrates the use of coroutines to implement the classic Sieve of Eratosthenes algorithm for finding prime numbers. Note the creation of coroutines inside a coroutine.

    proc filterByFactor {source n} {
        yield [info coroutine]
        while 1 {
            set x [$source]
            if {$x % $n} {
                yield $x
            }
        }
    }
    coroutine allNumbers apply {{} {while 1 {yield [incr x]}}}
    coroutine eratosthenes apply {c {
        yield
        while 1 {
            set n [$c]
            yield $n
            set c [coroutine prime$n filterByFactor $c $n]
        }
    }} allNumbers
    for {set i 1} {$i <= 20} {incr i} {
        puts "prime#$i = [eratosthenes]"
    }

この例が示すのは､互いに他を生成する三つのコルーチンの群の中で､如何に値を渡し得るかである: 　　　 This example shows how a value can be passed around a group of three coroutines that yield to each other:

    proc juggler {name target {value ""}} {
        if {$value eq ""} {
            set value [yield [info coroutine]]
        }
        while {$value ne ""} {
            puts "$name : $value"
            set value [string range $value 0 end-1]
            lassign [yieldto $target $value] value
        }
    }
    coroutine j1 juggler Larry [
        coroutine j2 juggler Curly [
            coroutine j3 juggler Moe j1]] "Nyuck!Nyuck!Nyuck!"

#### 詳細な意味論 DETAILED SEMANTICS

この例が実証することは､コルーチンは大域名前空間から出発し､コルーチンの棚が作成される前に command の決定が生じていることである｡ 　　　　　　　　 This example demonstrates that coroutines start from the global namespace, and that command resolution happens before the coroutine stack is created.

    proc report {where level} {
        # Where was the caller called from?
        set ns [uplevel 2 {namespace current}]
        yield "made $where $level context=$ns name=[info coroutine]"
    }
    proc example {} {
        report outer [info level]
    }
    namespace eval demo {
        proc example {} {
            report inner [info level]
        }
        proc makeExample {} {
            puts "making from [info level]"
            puts [coroutine coroEg example]
        }
        makeExample
    }

それが作成する出力は下の通りである｡特に､棚の操作が起っていることが判る(第１行と第２行の水準の比較から)又､コルーチンの親の水準は大域名前空間である｡又コルーチンの名前は修飾されていない場合は現在の名前空間に対し局所的であり､コルーチンがその水準で yield 活動するかもしれない､ことが分かる(譬えば､呼出された手続函数内で)｡　　　　　　　　　 Which produces the output below. In particular, we can see that stack manipulation has occurred (comparing the levels from the first and second line) and that the parent level in the coroutine is the global namespace. We can also see that coroutine names are local to the current namespace if not qualified, and that coroutines may yield at depth (e.g., in called procedures).

    making from 2
    made inner 1 context=:: name=::demo::coroEg

### SEE ALSO

apply, info, proc, return

### KEYWORDS

coroutine, generator
Copyright © 2009 Donal K. Fellows.