> Sure, you can reuse a variable for very different purposes but is that 
> really such an advantage?

You don't do this. Heck, you shouldn't even reuse a variable for the 
same purpose. Reusing variables tends to imply that you don't really 
know what their purpose was in the first place.

The advantage of dynamic typing comes in working with the hairier design 
patterns. It's a reduction ad extremum of a way of constraining object 
behaviour - the typical members of the "expliticly" typed language group 
use type / class hierarchies for this, and check against those.

The group of dynamically typed languages doesn't make assumptions based 
on the elements that make up an object's behaviour belonging together - 
an object is of the correct type for a given message send if it responds 
to said one message, nothing more, nothing less.

For (a very contrived) example any object that just so happens to 
properly respond to the messages for arithmethical operations can be 
substituted for an "integer" you only ever do arithmetics with without 
the language runtime batting an eyelash.

In dynamically typed languages, the type of an object isn't its "class" 
or any other predictable concept, it's just the protocol it adheres to 
during its lifetime. Most such languages also make no presumption that 
this protocol, or the behaviour of an object remains the same during its 
lifetime - which makes compile-time checks rather pointless.

Of course, you rarely use even this aspect of dynamic typing - in fact, 
I can't come up with a single noncontrived example for it, these things 
just don't occur in daily coding. But dynamic languages sure a heck 
faster to type, and the fact the compiler rarely bitches at all is very, 
very appealing to people that know what they're doing most of the time.

David Vallner