Path: news.daimi.aau.dk!olm From: olm@daimi.aau.dk (Ole Lehrmann Madsen) Newsgroups: daimi.beta Subject: Re: =?ISO-8859-1?Q?Singul=E6re?= patterns og INNER Date: 24 Sep 1998 20:49:49 GMT Organization: University of Aarhus, Department of Computer Science (DAIMI) Lines: 95 Distribution: daimi Message-ID: <6ueb9d$o77$1@xinwen.daimi.aau.dk> References: <6ue76j$cld$1@xinwen.daimi.aau.dk> NNTP-Posting-Host: ariel.daimi.aau.dk Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Trace: xinwen.daimi.aau.dk 906670189 24807 255.255.255.255 (24 Sep 1998 20:49:49 GMT) X-Complaints-To: news@daimi.aau.dk NNTP-Posting-Date: 24 Sep 1998 20:49:49 GMT X-Newsreader: NN version 6.5.3 (NOV) Xref: news.daimi.aau.dk daimi.beta:10376 In <6ue76j$cld$1@xinwen.daimi.aau.dk> Erik Corry writes: >Hej, >Beta har ikke ret mange loop konstruktioner. Men kan kan lave >sig nogle nye f.eks. forTo som er i standard biblioteket eller >de funky som f.eks. search som virker på lister. >Men hvis man gør det, kan man ikke bruge INNER inde i sin loop. >Det er jo tit det man vil. Hvis jeg f.eks. printer tallene fra >4 til 7: > (4, 17) -> forTo (# do inx -> putint; putline; #); >Hvis nu jeg af mystiske grunde tit har brug for sådan noget >kan jeg lave en pattern til det. Jeg vil gerne lave en ny loop >der laver ting 14 gange, hvor inx varierer fra 4 til 17: > MyFourSeventeenClass: > (# > do (4, 17) -> forTo (# do INNER #); Prøv INNER MyFourSeventeenClass som burde gøre det ønskede. Generelt kan man referere til et omliggende pattern med INNER P som i: P: (# do ... INNER P ... #) Og der kan være vilkårligt mange singulære i do-delen af P. BEMÆRK at INNER P kun er lovlig i do-deln af P. Ang. scope af fx 'inx' så kan denne ikke ses som du angiver, så du må erklære en ny index variable som du også selv foreslår ---olm > #); >Der får jeg allerede en advarsel om at INNER ikke kan bruges, >og hvis jeg prøver at bruge den: > MyFourSeventeenClass (# do inx -> putint; putline; #); >Så virker det ikke, for inx findes ikke. Den åbenlyse rettelse: > MyFourSeventeenClass: > (# > inx: @integer; > do (4, 17) -> forTo (# do INNER #); > #); >virker heller ikke, for MyFourSeventeenClass har ingen INNER clause. >Man kan selvfølgelig lave det uden at bruge forTo: > MyFourSeventeenClassThatWorks: > (# > iny, inx: @integer; > do (for iny: 14 repeat iny + 3 -> inx; INNER for); > #); >do > MyFourSeventeenClassThatWorks (# do inx -> putint; putline; #); >Men så er der ikke så meget ved ting som forTo, for de kan >ikke bruges det meste af tiden. Og det er endnu værre for >ting som search på lister der ikke er så enkle som forTo. >Så kan man lave en hjælpepattern: > MyFourSeventeenClassThatWorks2: > (# > DoTheStuff:< (# inx: @integer; enter inx do INNER; #); > do (4, 17) -> forTo (# do inx -> DoTheStuff #); > #); >Men den er ikke ret pæn når den bliver brugt: > MyFourSeventeenClassThatWorks2 > (# > DoTheStuff:: (# do inx -> putint; putline; #); > #); >Er der en smuk løsning? >Ville det være muligt at omdefinere INNER for singulære patters >til at være en INNER for den omgivende klasse (det er ikke et >forslag jeg har gennemtænkt)? >-- >Erik Corry