In data 3/30/2005, "Berger, Daniel" <Daniel.Berger / qwest.com> ha
scritto:

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

Adding Enumerable#step (or maybe Array#step) might not
be a bad idea but I do not know how common that usage
might be.

>Regards,
>
>Dan

E