From: tphyahoo Date: 2008-08-07T00:40:00+09:00 Subject: hello! first post to clr. I'm asking about an attempt at a lazy ruby solution to computing fibonacci numbers for a project euler problem. seems to be a bug in lazy ruby... Hi, first post to clr here. I have a guess a haskell bias as that's the last language I learned, and now I'm learning ruby. I was trying to solve project euler problem 2 as an exercise. This is, sum all the even fibonacci numbers less than 4 million. There is a solution that works at http://www.absorbeo.net/2008/01/10/project-euler-problem-2/ however I didn't quite like it because the test for evenness is in the fold (haskell speak for inject). puts a.inject(0) {|s,v| if v > 1_000_000 then break s elsif v % 2 == 0 s+v else s end } the haskell solution reads nicer to me t = ( putStrLn . show . sum . takeWhile (<=4000000) . filter even ) fibs2 fibs2 = 1 : 2 : zipWith (+) fibs2 (tail fibs2) but it relies on laziness and who knows what other magic. I decided to see if I could find a ruby solution that was more haskellish. It turns I can... almost. There is a ruby library for laziness # http://lazylist.rubyforge.org/ and it would seem to do what I want. But it hangs for some reason. I have poor sense of ruby culture. Should I report this as a bug? Is it even a bug? Do people ever use laziness, or is this crazy experimentation? Thanks for help and advice! Code below: thartman@thartman-laptop:~/thomashartman-learning/ruby/katas/euler>cat 2.rb require 'rubygems' require 'lazylist' # http://lazylist.rubyforge.org/ # Solve Project Euler problem 2: sum fibonacci numbers <= 4_000_000, which are even. fibs = ( LazyList.tabulate(0) { |x| x < 2 ? 1 : fibs[x-2] + fibs[x-1] } ) fibsUnder4M = ( fibs.partition{ |x| x <= 4_000_000 })[0] evenFibsUnder4M = fibsUnder4M.select{ |x| x %2 == 0} # problem seems to be with partition # evenFibsLessThanFourMil = ( evenFibs.partition{ |x| x <= 4_000_000 }) [0] # works # puts evenFibsLessThanFourMil.take(1) # hangs puts evenFibsUnder4M.take(10) # this is ok puts evenFibsUnder4M.take(11) # this hangs, laptop gets hot, fan turns on... # exit # this would be the answer to the euler problem, if only there wasn't the bug... result = evenFibsLessThanFourMil.inject(0){ | accum,val | accum + val} main = puts result thartman@thartman-laptop:~/thomashartman-learning/ruby/katas/ euler>ruby 2.rb 2 8 34 144 610 2584 10946 46368 196418 832040 ..... hung...