Sequences, lijsten, geneste lijsten en arrays

Deze datastrukturen werd reeds behandeld in de Maple Quickstart en Expression Manipulation Primer documenten en elders in deze tekst, ze worden hier enkel vermeld voor de volledigheid. Enkele aspecten die van belang zijn voor het schrijven van programma's worden hier nog even extra benadrukt.

De elementen van lijsten hoeven niet allemaal van hetzelfde type te zijn:

> L := [1, a, x -> x^3, [1, 2, 3]];

[Maple Math]

> map(`whattype`, L);

[Maple Math]

Meestal is dit niet zo nuttig, behalve in het geval van geneste lijsten: deze hoeven immers niet allemaal dezelfde lengte te hebben zodat data op een efficiente manier voorgesteld kan worden.

> T := [[a, b, c, d], [e, f, g], [h, i], [j]];

[Maple Math]

Deze geneste lijst kan gezien worden als de representatie van de symmetrische matrix hieronder:

> S := matrix([[a, b, c, d], [b, e, f, g], [c, f, h, i], [d, g, i, j]]);

[Maple Math]

De datastruktuur 'S' heeft n^2 elementen, 'T' slechts n(n+1)/2 waarbij n het aantal rijen van de matrix voorstelt. Voor grote waarden van n is dit verschil van groot belang: voor n = 100 zou 'S' 10000 elementen bevatten, tegenover 5050 voor 'T'.

Een datarepresentatie zoals 'T' is dan wel efficient, maar heeft als nadeel dat er moeilijk mee gewerkt kan worden. Men moet immers steeds nagaan of de indices i, j elementen boven of onder de diagonaal voorstellen:

> T[1,2];

[Maple Math]

> T[2,1];

[Maple Math]

Het bovenstaande resultaat is natuurlijk wel korrekt, maar het zou nuttig zijn de elementen van 'T' te kunnen adresseren zoals bij een gewone matrix. Dit kan met behulp van de volgende hogere orde functie en de resulterende closure voor 'T'.

> createMatrixRepr := proc(T::list)
proc(i::nonnegint, j::nonnegint)
if (i <= j) then
T[i,j];
else
T[j,i];
fi
end:
end:

> TM := createMatrixRepr(T);

[Maple Math]

> TM(1,2);

[Maple Math]

> TM(2,1);

[Maple Math]

> TM2 := createMatrixRepr([[1,2,3],[4,5],[6]]);

[Maple Math]

> TM2(1,2);

[Maple Math]

> TM2(2,1);

[Maple Math]

> L := 'L': S := 'S': T := 'T': createMatrixRepr := 'createMatrixRepr': TM := 'TM': TM2 := 'TM2':