control structures (was "Re: Sins")

Felix Thibault felixt at dicksonstreet.com
Sat Jan 8 11:53:38 EST 2000


At 01:50 1/9/00 +1100, skaller wrote:
>Skip Montanaro wrote:
>> 
>>     Emile> Doesn't this do that now? or is there some objection to this
usage?
>> 
>>     [ ... snip try/except used to implement state machine ... ]
>> 
>> I find nothing wrong with it.  Some people object to using try/except for
>> anything but handling errors however.
>
>My objection is twofold. First, the syntax is unweildy:
>
>	try:
>		for i in range(3):
>			if ... : raise X
>	except X:
>
>requires at least one extra level of indentation.
>
>[I'm interested in a 'generic' way to combine
>python statements which avoids this (like 'elif' does)
>Any ideas?]
>
>	My second objection is more serious:
>try .. raise .. except is too dynamic (for this usage): 
>there is no way to match up the exceptions actually 
>thrown with the handlers.
>
>	The constructions under consideration
>(variants on a construction proposed by Knuth)
>would support compile time verification that
>every loop exit had a corresponding handler
>lexically following the loop.
>
>	In particular, 'falling through'
>such a loop is impossible: all exits must be explicit.
>

What would be the problem with doing something like this:

def Foundfunc(...):
    ...
def NotFoundfunc(...):
    ...
exitState = 'NotFound'
exitFuncd = {'Found':Foundfunc, 'NotFound':NotFoundfunc}
for i in X:
    if i == e:
        exitState = 'Found'
        break
exitFunOut = exitFuncd[exitState](...)
...



>	Current looping constructions are so bad,
>that the simplest of uses cannot be expressed
>using them : searching a list for an element
>cannot be written correctly:
>
>	for i in X: 
>		if X[i]=e: goto Found
>	print "Not Found"
>	goto next
>	Found: ...
>	next
>
>YUKKKKKK!!! There is no natural way to do this.
>We fall through the loop on failure, instead
>of success. (using a flag, or testing anything
>afterwards, is not acceptable as a solution).
>
>Using exceptions:
>
>	try:
>		for i in X:
>			if X[i]==e: raise Found
>		raise NotFound
>	except Found: ..
>	except NotFound: ..
>
>is much cleaner, but exceptions are excessively
>dynamic for what is essential a static control
>flow problem. A solution will resemble the
>above exception handling implementation .. but
>with the matching up of exits and handlers enforced
>at compile time.
>
>-- 
>John (Max) Skaller, mailto:skaller at maxtal.com.au
>10/1 Toxteth Rd Glebe NSW 2037 Australia
>homepage: http://www.maxtal.com.au/~skaller
>voice: 61-2-9660-0850
>
>-- 
>http://www.python.org/mailman/listinfo/python-list
>
>





More information about the Python-list mailing list