RosettaCodeData/Task/Generator-Exponential/Tcl/generator-exponential-3.tcl

55 lines
907 B
Tcl

#!/usr/bin/env tclsh
package require generator
generator define idx_range {n m} {
for {set i $n} {$i < [expr $m -1]} {incr i} { generator yield $i }
}
generator define mth_power {m} {
set n 0
while {1} {
generator yield [expr $n ** $m]
incr n
}
}
generator define squares {} {
generator for x [mth_power 2] {
generator yield $x
}
}
generator define cubes {} {
generator for x [mth_power 3] {
generator yield $x
}
}
set acc {} ; # accumulator
set comm {} ; # common result
set limit 50
# run both generators concurrently
generator foreach x [squares] y [cubes] {
lappend acc $y
if { ! [expr {$x in $acc}] } { lappend comm $x }
if { [llength $comm] > $limit } {break}
}
# elements 20.. 30
set results [lrange $comm 19 29] ; # list range
generator foreach idx [idx_range 20 30] {
set x [lindex $comm $idx]
puts "$x"
}