first_class_environments.sf 714 B

1234567891011121314151617181920212223242526272829303132
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/First_class_environments
  4. #
  5. func calculator({.is_one} ) { 1 }
  6. func calculator(n {_ %% 2}) { n / 2 }
  7. func calculator(n ) { 3*n + 1 }
  8. func succ(this {_{:value}.is_one}, _) {
  9. return this
  10. }
  11. func succ(this, get_next) {
  12. this{:value} = get_next(this{:value})
  13. this{:count}++
  14. return this
  15. }
  16. var enviornments = (1..12 -> map {|i| Hash(value => i, count => 0) });
  17. while (!enviornments.map{ _{:value} }.all { .is_one }) {
  18. say enviornments.map {|h| "%4s" % h{:value} }.join;
  19. enviornments.range.each { |i|
  20. enviornments[i] = succ(enviornments[i], calculator);
  21. }
  22. }
  23. say 'Counts';
  24. say enviornments.map{ |h| "%4s" % h{:count} }.join;