From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: f43e6,9a0ff0bffdf63657 X-Google-Attributes: gidf43e6,public X-Google-Thread: fac41,9a0ff0bffdf63657 X-Google-Attributes: gidfac41,public X-Google-Thread: 1108a1,9a0ff0bffdf63657 X-Google-Attributes: gid1108a1,public X-Google-Thread: 103376,4b06f8f15f01a568 X-Google-Attributes: gid103376,public From: Darren New Subject: Re: Software landmines (loops) Date: 1998/09/01 Message-ID: <35EC36E9.2FBC9E79@fv.com>#1/1 X-Deja-AN: 386859158 Content-Transfer-Encoding: 7bit References: <902934874.2099.0.nnrp-10.c246a717@news.demon.co.uk> <6r1glm$bvh$1@nnrp1.dejanews.com> <6r9f8h$jtm$1@nnrp1.dejanews.com> <6renh8$ga7$1@nnrp1.dejanews.com> <6rf59b$2ud$1@nnrp1.dejanews.com> <6rfra4$rul$1@nnrp1.dejanews.com> <35DBDD24.D003404D@calfp.co.uk> <6sbuod$fra$1@hirame.wwa.com> <35f51e53.48044143@ <904556531.666222@miso.it.uq.edu.au> <35EAEC47.164424A7@s054.aone.net.au> <35EBBFAF.DE38C061@s054.aone.net.au> <35EC28BD.351F33DF@s054.aone.net.au> Content-Type: text/plain; charset=us-ascii Organization: First Virtual Holdings Inc Mime-Version: 1.0 Newsgroups: comp.lang.eiffel,comp.object,comp.software-eng,comp.lang.ada Date: 1998-09-01T00:00:00+00:00 List-Id: Loryn Jenkins wrote: > equal (l,r: LIST): BOOLEAN is > require > l /= Void and r /= Void > do > from > Result := (l.count = r.count) > l.start; r.start > until > not Result or l.off > loop > Result := (l.item = r.item) > l.forth; r.forth > end > end And of course, this becomes much more readable when you use variables whose names mean what they say. equal (l,r: LIST): BOOLEAN is require l /= Void and r /= Void local stacks_are_known_different : BOOLEAN do from stacks_are_known_different := (l.count /= r.count) l.start; r.start until stacks_are_known_different or l.off loop stacks_are_known_different := (l.item /= r.item) l.forth; r.forth end Result := not stacks_are_known_different end (With a minor renaming to get rid of "not". I don't *think* I broke it.) I think picking the proper names for locals invariably clarifies the code, even at the expense of declaring another local. The first time you assign to "Result", you're not assigning the "result". One of my rules of thumb for clear programming is "have a meaning for every variable that is appropriate at every line of the algorithm". Otherwise, you're using the same variable for multiple unrelated values. Here, it's clear just by looking that you know the stacks are different if the counts are different or the items are different, you stop the loop as soon as you know the stacks are different, and the result is whether you know the stacks are different at the bottom of the loop. This is a bit more pendantic than I usually am, but I think it's *very* clear, and certainly more clear than embedded returns. -- Darren New / Senior Software Architect / First Virtual Holdings Inc http://www.fv.com or info@fv.com -=|=- PGP Key: ftp://ftp.fv.com/pub/fv Fingerprint: 61 7D AF 9E 00 CC C2 ED / D8 4C D7 AA E4 C2 A0 73