Dear Alexei, On Fri, 6 Oct 2006, Sheplyakov Alexei wrote:
I don't think your analysis is completely correct. The problem is that
e = e.subs(something)
calls e.eval(), and eval can change the original expression so that iterators become invalid. Actually, after the evaluation expression can be *anything*, even not necessarily indexed. For example, the expression in question could evaluate to zero (if someone implements derived class such that for some combination of indices the thing evaluates to zero).
It is true that an evaluation function can be written such that this goes wrong. However, I was assuming that evaluation functions are doing things to expressions that make sense. Assuming that the metric is invertible, it is not possible that A~mu~nu~sigma~tau is nonzero and that A.mu~nu~sigma~tau is zero. Hence, an evaluation function that turns one of them into zero should do this to the other as well. Do you know of any evaluation that does make sense where we would encounter this kind of problem? I thought about this, but came to the conclusion that this probably cannot happen. On the other hand, as a matter of principle you are right that it is best to assume as little about the rest of the code as possbile. For this reason I would accept a patch that would do the substitutions as they are currently but does not cause eval to be called. Best wishes, Chris