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: fac41,9a0ff0bffdf63657 X-Google-Attributes: gidfac41,public X-Google-Thread: 103376,4b06f8f15f01a568 X-Google-Attributes: gid103376,public X-Google-Thread: f43e6,9a0ff0bffdf63657 X-Google-Attributes: gidf43e6,public X-Google-Thread: 1108a1,9a0ff0bffdf63657 X-Google-Attributes: gid1108a1,public From: Matthew Heaney Subject: Re: Software landmines (loops) Date: 1998/09/01 Message-ID: #1/1 X-Deja-AN: 386744238 Sender: matt@mheaney.ni.net 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> NNTP-Posting-Date: Tue, 01 Sep 1998 04:01:48 PDT Newsgroups: comp.lang.eiffel,comp.object,comp.software-eng,comp.lang.ada Date: 1998-09-01T00:00:00+00:00 List-Id: Loryn Jenkins writes: > > equal (l,r: LIST): BOOLEAN is > require > l /= Void and r /= Void > do > Result := l.count /= r.count > if Result then > from > l.start; r.start > until > not Result or l.off > loop > Result := l.item /= r.item > l.forth; r.forth > end > end > end > > > > The way I look at this problem, is that it's like searching for a > > specific house on an unfamiliar block. As you're driving, when you find > > the house, you stop immediately and declare success. You don't have to > > drive to the end of the block, and then say where the house was. > > Yeah, yeah. Same here, given the amended code. No, no, not the same here. If the test l.count /= r.count returns False, then you know immediately what the return value of the function is, so why not deliver that information right away? That way you can remove the test of result (reducing the level of nesting), and simplify the predicate, (By way of analogy, if you've found the house, then you can park in the driveway right way, instead of driving to the end of the block to announce that you found the house.) Let's once again compare the decision tables. If we re-write the code, to put it into Matt-like (because Matt likes it) syntax: equal (l,r: LIST): BOOLEAN is require l /= Void and r /= Void do if l.count /= r.count then return False end from l.start; r.start until l.off loop if l.item /= r.item then return False end l.forth; r.forth end return True end This version has only two rules in the decision table for the loop predicate: 1 2 l.off T F The uncorrected version has four rules: 1 2 3 4 not Result T T F F l.off T F T F The difference in styles is really a debate about the number of edges in the flow graph vs the number of rules in the decision table.