Generator/Exponential: Difference between revisions

From Rosetta Code
Content added Content deleted
(Wrote a draft task on generators)
 
(→‎Tcl: Added implementation)
Line 4: Line 4:
* http://en.wikipedia.org/wiki/Generator_(computer_science)
* http://en.wikipedia.org/wiki/Generator_(computer_science)


'''Task:''' Write a generator (or generators), in the most natural way in your language, that produces the numbers that are squares (<math>n^2</math>) but not cubes (<math>m^3</math>) and use that to print the first 20 members of that sequence.
'''Task:''' Write a generator (or generators), in the most natural way in your language, that produces the numbers that are squares (<math>n^2</math>) but not cubes (<math>m^3</math>) and use that to print the first 21st to 30th members of that sequence.

=={{header|Tcl}}==
{{works with|Tcl|8.6}
<lang tcl>package require Tcl 8.6

proc powers m {
yield
for {set n 0} true {incr n} {
yield [expr {$n ** $m}]
}
}
coroutine squares powers 2
coroutine cubes powers 3
coroutine filtered apply {{s1 s2} {
yield
set f [$s2]
set v [$s1]
while true {
if {$v > $f} {
set f [$s2]
continue
} elseif {$v < $f} {
yield $v
}
set v [$s1]
}
}} squares cubes

for {set i 0} {$i<20} {incr i} {filtered}
for {} {$i<30} {incr i} {
puts [filtered]
}</lang>
Output:
<pre>
529
576
625
676
784
841
900
961
1024
1089
</pre>

Revision as of 13:57, 22 November 2010

Generator/Exponential is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

A generator is an executable entity (like a function or procedure) that contains code that yields a sequence of values, one at a time, so that each time you call the generator, the next value in the sequence is provided. Generators are often built on top of coroutines or objects so that the internal state of the object is handled “naturally”. Generators are often used in situations where a sequence is potentially infinite, and where it is possible to construct the next value of the sequence with only minimal state.

See also:

Task: Write a generator (or generators), in the most natural way in your language, that produces the numbers that are squares () but not cubes () and use that to print the first 21st to 30th members of that sequence.

Tcl

{{works with|Tcl|8.6} <lang tcl>package require Tcl 8.6

proc powers m {

   yield
   for {set n 0} true {incr n} {

yield [expr {$n ** $m}]

   }

} coroutine squares powers 2 coroutine cubes powers 3 coroutine filtered apply {{s1 s2} {

   yield
   set f [$s2]
   set v [$s1]
   while true {

if {$v > $f} { set f [$s2] continue } elseif {$v < $f} { yield $v } set v [$s1]

   }

}} squares cubes

for {set i 0} {$i<20} {incr i} {filtered} for {} {$i<30} {incr i} {

   puts [filtered]

}</lang> Output:

529
576
625
676
784
841
900
961
1024
1089