On Apr 16, 2008, at 8:51 AM, Tim Pease wrote:
>>> cleanup = lambda {
>>> next if $cleanup_was_already_done
>>> $cleanup_was_already_done = true
>>> # your cleanup code goes here
>>> }
>>>
>>> Signal.list.values.each do |signal|
>>> Signal.trap(signal,&cleanup)
>>> end
>>
>> cleanup = lambda do
>> cleanup = lambda{}
>> p 'cleanup'
>> end
>>
>
> That's not going to work. The various exit handlers already have a  
> reference to the cleanup proc, so reassigning the cleanup variable  
> will not prevent it from getting called twice. I know that global  
> variables are ugly, but there is a time and a place for everything.
>
> And it's way too clever for me ;)

the whole code:

cfp:~ > cat a.rb
cleanup = lambda do
   cleanup = lambda{}
   p :cleanup
end

Signal.trap('HUP'){ cleanup.call }
Signal.trap('USR1'){ cleanup.call }

Process.kill 'HUP', Process.pid
Process.kill 'USR1', Process.pid


cfp:~ > ruby a.rb
:cleanup


just avoids needing an external/global switch...

a @ http://codeforpeople.com/
--
we can deny everything, except that we have the possibility of being  
better. simply reflect on that.
h.h. the 14th dalai lama