> -----Original Message-----
> From: pmak / aaanime.net [mailto:pmak / aaanime.net] 
> Sent: Wednesday, March 30, 2005 11:30 AM
> To: ruby-talk ML
> Subject: Syntax sugar idea for loops
> 
> 
> I was working with a proprietary programming language called 
> Traction <www.tractionsoftware.com>, and I noticed something 
> pretty cool they had in their loop constructs.
> 
> Consider the following Ruby code:
> 
>     every_other = true
>     people.each do |person|
>         every_other = !every_other
>         row_class = every_other ? 'row1' : 'row2'
>         puts "<tr class=#{row_class}><td>#{person.name}</td>
> <td>#{person.email}</td></tr>"
>     end
> 
> This code prints out an HTML table of peoples' names and 
> e-mail addresses. The <tr> tags alternate with having 
> class="row1" and class="row2", allowing every other row to be 
> colored differently.
> 
> Consider these two lines of the code, though:
> 
>     every_other = true
>         every_other = !every_other
> 
> These lines could be replaced by syntax sugar. Traction has 
> the following "Special Loop Tags":
> 
>     <loop.first>: true if this is the first iteration of the loop
>     <loop.inner> true if this is not the first or last 
> iteration of the loop
>     <loop.odd> true if this is an odd iteration
>     <loop.last>: true if this is the last iteration of the loop
> 
> (In the case of nested loops, they apply to the innermost 
> loop.) Maybe Ruby could use this sort of syntax sugar, too? 
> So in my example above, there would be a built-in variable 
> that replaces my "every_other" variable.

I think Enumerable#each_with_index largely eliminates the need for such
syntactic sugar.  Consider:

people.each_with_index do |person, i|
   puts "First person: #{person}" if i == 0
   row_class = i%2 == 0 ? "row1" : "row2"
   puts "<tr class=#{row_class}><td>#{person.name}</td>
   puts "Last person: #{person}" if i == people.length - 1
end

I suppose you could extend Fixnum within a loop to include extra methods
so that you could do something like this:

people.each_with_index do |person, i|
   puts "First person: #{person} if i.first?
   row_class = i.even? ? "row1" : "row2"
   puts "Last person: #{person} if i.last?
end

But that would mean making some serious modifications to Enumerable
(wouldn't it?).  Not a bad idea, just not worth the added code
maintenance IMHO.

Regards,

Dan