What happens if two trimmed multiples overlap? For example, consider the program
PROGRAM slices CONTEXT VOID USE standard BEGIN [4]INT r; PROC res = VOID: FOR n FROM LWB r TO UPB r DO r[n]:=n OD; PROC mpr = ([]INT m)VOID: ( FOR i FROM LWB m TO UPB m DO print((whole(m[i],0),blank)) OD; print(newline) ); #mpr# res; print("Original contents:"); mpr(r); r[:UPB r-1]:=r[1+LWB r:]; print((newline,"r[:3]:=r[2:]",newline, "Compiler does it: ")); mpr(r); res; FOR i FROM LWB r TO UPB r-1 DO r[i]:=r[i+1] OD; print("Forwards loop: "); mpr(r); res; FOR i FROM UPB r-1 BY -1 TO LWB r DO r[i]:=r[i+1] OD; print("Backwards loop: "); mpr(r); res; r[1+LWB r:]:=r[:UPB r-1]; print((newline,"r[2:]:=r[:3]",newline, "Compiler does it: ")); mpr(r); res; FOR i FROM 1+LWB r TO UPB r DO r[i]:=r[i-1] OD; print("Forwards loop: "); mpr(r); res; FOR i FROM UPB r BY -1 TO 1+LWB r DO r[i]:=r[i-1] OD; print("Backwards loop: "); mpr(r) END FINISH
When compiled and executed, the program gives the following output:
Original contents:1 2 3 4 r[:3]:=r[2:] Compiler does it: 2 3 4 4 Forwards loop: 2 3 4 4 Backwards loop: 4 4 4 4 r[2:]:=r[:3] Compiler does it: 1 1 2 3 Forwards loop: 1 1 1 1 Backwards loop: 1 1 2 3
Notice that lines 5 and 8 of the results are definitely wrong, but that the compiler gets it right both times. The lesson is, do not worry about overlapping multiples: the compiler will ensure you get the effect you want.
A different matter is when you want to replace a column of a square multiple with a row. Here, the overlap is more of a “crossoverlap”. In this case you need to be careful--see the next exercise.
((1,2,3), ((1,4,7), (4,5,6), => (2,5,8), (7,8,9)) (3,6,9))Your procedure should cater for any size of square multiple. Ans
Sian Mountbatten 2012-01-19