What is a type error? [correction]

David Hopwood david.nospam.hopwood at blueyonder.co.uk
Tue Jul 18 13:18:08 EDT 2006


Darren New wrote:
> David Hopwood wrote:
> 
[...]
>> Apparently, Hermes (at least the version of it described in that paper)
>> essentially forgets that is_last has been initialized at the top of the
>> loop, and so when it does the merge, it is merging 'not necessarily
>> initialized' with 'initialized'.
> 
> No, it's not that it "forgets". It's that the "insert line into inputs"
> unitializes "line". Hence, "line" is only conditionally set at the
> bottom of the loop, so it's only conditionally set at the top of the loop.
> 
>> This sounds like a pretty easy thing to fix to me (and maybe it was fixed
>> later, since there are other papers on Hermes' typestate checking that I
>> haven't read yet).
> 
> You simply misunderstand the "insert line into inputs" semantics.

Yes, you're right, I did misunderstand this.

> Had that line actually been commented out in the Hermes code, the loop would
> have compiled without a problem.
> 
> That said, in my experience, finding this sort of typestate error
> invariably led me to writing clearer code.
> 
> boolean found_ending = false;
> while (!found_ending) {
>   string line = getString();
>   if (line.charAt(0) == 'q')
>     found_ending = true;
>   else
>     insert line into inputs;
> }
> 
> It seems that's much clearer to me than the contorted version presented
> as the example. If you want it to work like the Java code, where you can
> still access the "line" variable after the loop, the rearrangement is
> trivial and transparent as well.

I agree.

-- 
David Hopwood <david.nospam.hopwood at blueyonder.co.uk>



More information about the Python-list mailing list