On May 27, 2009, at 9:35 AM, J Haas wrote:

> On May 22, 9:01 am, Roger Pack <rogerpack2... / gmail.com> wrote:
>> Tony's point was that certain constructs, like case statements,  
>> won't be
>> transformable into indentation only blocks.  Does that make sense?
>
> No, it doesn't, because I don't see why case statements are not
> transformable into indent-only blocks. I've _done_ them using the
> quick-and-dirty hacky script and they work just fine. (In cases like
> Joshua's impossible.rb I had to make a minor modification to the
> script to have it inject 'end ' rather than 'end\n', but it still
> worked fine.)

Ok, but now you're beginning to see the edge cases that make this sort  
of transformation difficult on a global level. Specifically, how would  
you differentiate between these two cases using Pythonic indentation:

 > cat conditional_case.rb
result = case ARGV[0]
   when /^\d*$/
     "That's an integer"
   when /^[A-Za-z]*$/
     "That looks like a word..."
   else
     "That's not an integer or a word"
   end if ARGV[0]

puts result

 > cat case_and_conditional.rb
result = case ARGV[0]
   when /^\d*$/
     "That's an integer"
   when /^[A-Za-z]*$/
     "That looks like a word..."
   else
     "That's not an integer or a word"
   end
if ARGV[0]
   puts result
end


Attaching a conditional to the end of a case statement (or any block,  
for that matter) is possible in Ruby because the block is just an  
expression, and the statement doesn't end until the newline. With your  
preprocessor, adding "end " when the indentation level decreases would  
yield the first form, but then how do I get the second form? I suppose  
I could both decrease the indentation level and leave a blank space,  
but then it seems like we're adding an awful lot of formatting rules  
just to have the code look nice and still function. On top of that, I  
think this makes things much less clear! Consider that in "Pythonic  
form" the above cases would become:

 > cat pythonic_conditional_case.rb
result = case ARGV[0]:
   when /^\d*$/
     "That's an integer"
   when /^[A-Za-z]*$/
     "That looks like a word..."
   else
     "That's not an integer or a word"
if ARGV[0]
puts result

 > cat pythonic_case_and_conditional.rb
result = case ARGV[0]:
   when /^\d*$/
     "That's an integer"
   when /^[A-Za-z]*$/
     "That looks like a word..."
   else
     "That's not an integer or a word"

if ARGV[0]:
   puts result


Looking at those two pieces of code, is it clear that they do two  
different things? At the very least, I think that this sort of change  
to the syntax would have to be optional. This would, of course, mean  
that you're not getting rid of all of the "end"s in code, so then  
what's the point (other than to confuse matters of syntax even more)?

Let me also provide a counter-point. I'm currently using MacVim with  
the ruby-vim files and a coloring scheme which colors "def...end"  
pairs in yellow and other "case/if/do/etc...end" pairs in purple. This  
gives me a good way to quickly look at some code, and if I see that  
the "end" immediately preceding a "def" is purple, then I know I've  
forgotten and "end" somewhere in that function definition.

Finally, let me suggest a bit of a "wisdom of crowds" argument: if the  
advantages to significant whitespace were so unambiguously clear as  
you'd have us believe, then why do most languages not use it (even  
those developed before many of the advantages of advanced text editors/ 
IDEs existed)?

- Josh