arrays/lists with multi-idices



On 6/18/07, Fabrizio Caruso <caruso at dm.unipi.it> wrote:

> Sorry but I don't know hot to force arrays to be local.
> There must be something I am missing.
>
> For instance:
> foo(x):= block([b],b:make_array('hashed,3),b[1]:x);
>
> will change b[1] after its execution.
>
> Moreover I would like to use things like
> b[5,2,3,4] where the number of arguments is a parameter.

Fabrizio, (1) local(a) within a block saves and restores the
properties (including some varieties of arrays) of a when the
block is entered and exited. (2) For Maxima arrays
implemented as Lisp hashtables, the number of indices is
immaterial; a hash key can be a list of indices (or anything).
For Maxima arrays implemented as Lisp arrays,
arraymake and arrayapply might be useful.

e.g.

foo (x) := block (local (b), array (b, 5), b[1] : x, listarray (b));
foo (3);
  => [#####, 3, #####, #####, #####, #####]
listarray (b);
 => (error message, b is not an array)

bar (a, [L]) := arrayapply (a, L);
bar (x, i, j);
  => x[i, j]
bar (x, i, j, k);
  => x[i, j, k]

I'm sorry that this is confusing; various ideas about arrays,
not entirely consistent, accumulated over the decades.
I think now is a good time to reconsider and maybe
clean up some of that stuff.

Maybe if you say more about what you're trying to accomplish
we can give some advice.

FWIW
Robert