Quoting chiaro scuro <kiaroskuro / gmail.com>:

> I guess that in principle when you see an '=', you could lookup a
> 'name=' method before deciding that it is a local var assignment
> rather than a method call.
>
> I also understand that there will be perfromance issues with
> that.
>
> did I miss something?

In Ruby's grammar, expressions containing a name parse differently
depending on whether that name is a variable or a method.

Whatever rule is used has to be able to distinguish between the two
at parse-time; you can't rely on run-time information.

So, the current parsing rule is: "If you see an assignment to a bare
name, that name means a variable until the end of the block/method. 
Until then it means a method call."

e.g.:

 def foo
   n # method
 end

 def bar
   n = 3
   n # variable
 end

 def baz
   n # method
   n = 3
   n # variable
 end

Note that it doesn't matter if the assignment is actually performed,
just that the parser sees it:

 def hoge
   n # method
   if false
     n = 3
   end
   n # variable
 end

(uninitialized variables are nil)

-mental