Doh! "while true" makes a lot more sense than
recursion, doesn't it?

Anybody have a sledgehammer? I see a fly...

Eric Armstrong wrote:
> There is no inefficency here. Recursion isn't
> being used to count down. That's in a loop.
> 
> Recursion is only being used to restart the
> timer after it expires. No stack space is
> required. Any sufficiently optimizing compiler
> will take the stack out of the equation.
> (Whether ruby does so is another matter.)
> 
> The question is really about the nature of
> instance variables in a script, I guess.
> 
> It seems they can only be initialized in a
> method. (Something I keep forgetting. I'm
> /so/ used to intializing instance variables
> in Java.)
> 
> Defining initialize() didn't work, because
> the Object object the variables belong to
> in a script is already created when that
> definition is processed. So it never runs.
> 
> The obvious solution (which occurs to me only
> now) is to create an init() method, and
> invoke it before the first call to run().
> 
> As the mathematician said...
> 
>   "It is now obvious that...wait a minute...
>    let me check that...(works furiously)...
>    Yes! It /is/ obvious..."
> 
> 
> Matthew Smillie wrote:
>> On Jul 20, 2006, at 20:03, Eric Armstrong wrote:
>>
>>> Is it me, or is it pretty much impossible
>>> to write a recursive script in ruby unless
>>> you use global variables?
>>>
>>> I have a simple countdown timer. I
>>> set up the number of seconds to sleep,
>>> sleep for a while, and then beep.
>>>
>>> A single run is easily done in a script
>>> (code below). The problems start when
>>> I define a run method and recurse.
>>>
>>> Unless I use global variables, there
>>> doesn't seem to be any way for the
>>> variables to get the data.
>>>
>>> Is that about it?
>>
>> Well, in this case, if you're using global variables, there's not much 
>> of a point to making the method recursive (which stores all of its 
>> local variables on the stack).  The typical way to do recursive method 
>> is to pass the relevant information as parameters, e.g.,
>>
>> def countdown(seconds)
>>   sleep(1)
>>   puts "tick"
>>   sleep(1)
>>   puts "tock"
>>   countdown(seconds - 2)
>> end
>>
>> I'll also mention that a deep recursion like this is a horribly 
>> inefficient way to do a countdown timer.
>>
>> matthew smillie
>>
>>>
>>>
>>> Initial Script
>>> --------------
>>> #!/usr/bin/env ruby
>>>
>>> # Beeps and character I/O
>>> require 'curses'
>>> include Curses
>>>
>>> @seconds = 10
>>> @minutes = 0
>>> @hours = 0
>>>
>>> #def run
>>>   timeremaining = (3600 * @hours)
>>>                 + (60 * @minutes)
>>>                 + @seconds
>>>   puts "sleeping for " + time_remaining.to_s
>>>   timeremaining.downto(0) do |i|
>>>     sleep(1)
>>>     print i.to_s + ".."
>>>   end
>>>   puts
>>>   beep; beep; beep
>>>   sleep 1
>>>   beep; beep; beep
>>>   sleep 1
>>>   beep; beep; beep
>>>
>>> # run
>>> #end
>>>
>>> #run
>>>
>>>
>>>
>>>
>>
>>
>