> -----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