generator_exponential.sf 689 B

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Generator/Exponential#Sidef
  4. #
  5. func gen_pow(m) {
  6. var e = 0
  7. func { e++ ** m }
  8. }
  9.  
  10. func gen_filter(g1, g2) {
  11. var v2 = g2.run
  12. func {
  13. loop {
  14. var v1 = g1.run
  15. while (v1 > v2) { v2 = g2.run }
  16. v1 == v2 || return v1
  17. }
  18. }
  19. }
  20.  
  21. # Create generators.
  22. var squares = gen_pow(2)
  23. var cubes = gen_pow(3)
  24. var squares_without_cubes = gen_filter(squares, cubes)
  25.  
  26. # Drop 20 values.
  27. { squares_without_cubes() } * 20
  28.  
  29. # Print 10 values.
  30. var answer = []
  31. { answer.append(squares_without_cubes()) } * 10
  32. say answer
  33. assert_eq(answer, [529, 576, 625, 676, 784, 841, 900, 961, 1024, 1089]);