in reply to cartesian product preserving order

One approach is to do the cartesian product of the first 2 lists, which it sounds like you already have working. Then use that partial cartesian product as 1 list, and take the cartesian product of that list against the next list, and so on, until you are out of lists.

We aware that with this approach taking the product using one of the partial products will be slightly different than with 2 of the original lists. I.E.

A partial list will look like:
[a,1],[a,2],[a,3],[b,1],[b,2],[b,3]

Whereas an original list will be like:
(-, +, *)

So when using a partial product be careful not to end up with something like:
[[a,1],-]

Hope this helps