^ From:

> ^ Subject:

Two thoughts for the Forum. The first is about the compiler-to-be,

and the second is a suggested improvement to the code for Collected.

Consider the following very simple code, designed to take an integer

as input:

f := function (x) return x+1; end; g := function (y) return f(y); end; f := function (x) return 2*x; end; g(2);

At present, g(2) will return 4, as the current definition of f(x) is

to return 2*x.

However, if we want to have an optimising compiler, then compilation

of g should take into account the definition of f and not simply call

f. This gets even hairier if a function has a recursive definition,

but somewhere in the recursion (perhaps at a lower level?) the

function definition might be changed.

Any thoughts?

-----------------------------------------------

Having looked at the code for Collected (in list.g), may I suggest the

following as a possible alternative, which might well be faster in

many cases?

Collected := function(L) local i, # counter for current position in mset mset, # the resulting multiset l, # the current element of the list L last_l; # the last element read from L

if Length(L) = 0 then return []; fi;# We take a shallow copy of L before we sort it so that the input list

# remains unchanged

L := ShallowCopy(L);

Sort(L);

mset := [ [L[1],0] ]; # initialise the variables last_l := L[1]; i := 1; for l in L do if l = last_l then mset[i][2] := mset[i][2] + 1; else i := i + 1; mset[i] := [l,1]; last_l := l; fi; od; return mset; end; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Julian Gilbey Email: J.D.Gilbey@qmw.ac.uk Dept of Mathematical Sciences Queen Mary & Westfield College Finger me or talk to me at: Mile End Road jdg@euclid.maths.qmw.ac.uk London E1 4NS, ENGLAND ( Logon info attached )

> < [top]