|    seed = @start
|    whatever = lambda do
|     yield(seed)
|     @skip.times { seed = seed.succ }
|     return if @halt.call(seed) if @halt
|    end
|    @step ? @step.times(&whatever) : loop(&whatever)
|   end


FYI: I ended up using this lambda approach after all. Many thanks to those who 
suggested it.

I occurs to me that this also has to do with 1st class methods. An (as of yet) 
untested possibility:

  ( @step ? @step.method(:times) : method(:loop) ).call proc do
  yield(seed)
  @skip.times { seed = seed.succ }
  return if @halt.call(seed) if @halt
  end

T.