Programming D. E. Knuth in Python with the Deterministic Finite Automaton construct

Kiuhnm kiuhnm03.4t.yahoo.it
Sat Mar 17 18:55:14 CET 2012


On 3/17/2012 16:53, Michael Torrie wrote:
> On 03/17/2012 09:12 AM, Kiuhnm wrote:
>> On 3/17/2012 16:01, Michael Torrie wrote:
>>> On 03/17/2012 08:45 AM, Kiuhnm wrote:
>>>> Your way is easy, but the result is poor.
>>>
>>> In what way?
>>
>> The resulting code is inefficient, difficult to comprehend and to mantain.
>>
>>> What is your recommended way?
>>
>> One should rewrite the code. There is a reason why Python doesn't have
>> gotos.
> 
> We appear to have a language barrier here.  How should one rewrite the
> code?  Everyone knows python doesn't have gotos and state machines have
> to be created using other mechanisms like loops, state variables, and
> such.  Your suggestion to "rewrite the code" is unhelpful to the OP if
> you're not willing to suggest the best method for doing so.

Why should I write a treatise on decompilation techniques on this ng?

> Saying, "be
> like a decompiler" doesn't say anything.

That looks like a glaring contradiction to me...
I'm sure the interested reader will think of some ways of getting additional information on the subject.

Here's an example of rewriting:

A1. (Do the work of Phase A1.)  If <zap> then go to Phase A5,
otherwise continue.
A2. (Do some work.) If <zorp> go to Phase A4.
A3. (Some more work.)
A4. (Do something.)  If <condition ZZZ> go to Phase A1.
A5. (Something more).  If <foobar> then go to Phase A2, otherwise
end. 

==>

A1. (Do the work of Phase A1.)
If not <zap>:
    A2. (Do some work.) If <zorp> go to Phase A4.
    A3. (Some more work.)
    A4. (Do something.)  If <condition ZZZ> go to Phase A1.
A5. (Something more).  If <foobar> then go to Phase A2, otherwise
end. 

==>

A1. (Do the work of Phase A1.)
If not <zap>:
    A2. (Do some work.)
    If not <zorp>:
        A3. (Some more work.)
    A4. (Do something.)  If <condition ZZZ> go to Phase A1.
A5. (Something more).  If <foobar> then go to Phase A2, otherwise
end. 

==>

while (True):
    A1. (Do the work of Phase A1.)
    If not <zap>:
        A2. (Do some work.)
        If not <zorp>:
            A3. (Some more work.)
        A4. (Do something.)
        If not <condition ZZZ>:
            break
A5. (Something more).  If <foobar> then go to Phase A2

==>

while (True):
    A1. (Do the work of Phase A1.)
    If not <zap>:
        A2. (Do some work.)
        If not <zorp>:
            A3. (Some more work.)
        A4. (Do something.)
        If not <condition ZZZ>:
            A5. (Something more).
            If <foobar> then go to Phase A2
            break

==>

again = TRUE
while (again):
    A1. (Do the work of Phase A1.)
    If not <zap>:
        while (True):
            A2. (Do some work.)
            If not <zorp>:
                A3. (Some more work.)
            A4. (Do something.)
            If not <condition ZZZ>:
                A5. (Something more).
                If <foobar>:
                    continue
                again = FALSE; break

==>

def f:
    while (True):
        A1. (Do the work of Phase A1.)
        If not <zap>:
            while (True):
                A2. (Do some work.)
                If not <zorp>:
                    A3. (Some more work.)
                A4. (Do something.)
                If not <condition ZZZ>:
                    A5. (Something more).
                    If <foobar>:
                        continue
                    return

==>

def f:
    while (True):
        A1. (Do the work of Phase A1.)
        If <zap>:
            continue
        while (True):
            A2. (Do some work.)
            If not <zorp>:
                A3. (Some more work.)
            A4. (Do something.)
            If not <condition ZZZ>:
                A5. (Something more).
                If <foobar>:
                    continue
                return

==>

def f:
    while (True):
        A1. (Do the work of Phase A1.)
        If <zap>:
            continue
        while (True):
            A2. (Do some work.)
            If not <zorp>:
                A3. (Some more work.)
            A4. (Do something.)
            If <condition ZZZ>:
                continue
            A5. (Something more).
            If <foobar>:
                continue
            return

==>

def f:
    while (True):
        A1. (Do the work of Phase A1.)
        If <zap>:
            continue
        while (True):
            A2. (Do some work.)
            If not <zorp>:
                A3. (Some more work.)
            A4. (Do something.)
            If <condition ZZZ>:
                continue
            A5. (Something more).
            If not <foobar>:
                return

Etc... until you're satisfied with the result.

If the code is more complex, divide et impera.

Kiuhnm



More information about the Python-list mailing list