Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I'm trying to work with some vectors and have run into a strange problem. An obvious way to define a difference of two vectors would be

dif[x_,y_] := x-y

I thought an equivalent way of doing this would be

dif[x_,y_] := Table[x-z,{z,{y}}][[1]]

However, using this second method, there is some strange behaviour. When I evaluate

dif[{x,z},{0,0}]

I get the result

{x,{0,0}}

which is clearly not what I wanted.

If I try evaluating

dif[{x,y},{0,0}]

instead, everything is ok, which leads me to think that the variable z in my definition of dif is treated as non-local. This seems pretty counterintuitive to me, as I was expecting z to act as a dummy variable.

What am I missing?

One solution that works is using Module. This is a bit unsatisfying though, as it seems to me z should be treated as local even without having to explicitly demand this.

share|improve this question
add comment

1 Answer

up vote 7 down vote accepted

Table doesn't scope the variable like that. This allows you to do things like this:

a = x^2;
Table[a, {x, 0, 3}]
(*{0, 1, 4, 9}*)

In your case you would like to scope z, which you can do via:

dif[x_, y_] := Module[{z}, Table[x - z, {z, {y}}][[1]]]

I think the relevant part of the doc is where it states: "Table effectively uses Block to localize values or variables."

So what it's doing is roughly evaluating: Block[{z=y},x-z], which means any z present in x will also get substituted. Though I think it could have been stated more clearly and properbly should have an example under possible issues.

share|improve this answer
    
Interesting ... So I should use modules all over the place just to make sure bad things don't happen? –  Dejan Govc Feb 12 '13 at 12:52
    
@DejanGovc The alternative would be that others would have to write quite complicated code substitution schemes everywhere where they did want to have this sort of behavior. It's quite easy for you to just not use table in this type of situation where you could get by perfectly fine with Map. –  jVincent Feb 12 '13 at 12:55
    
Sounds reasonable. Thanks. –  Dejan Govc Feb 12 '13 at 12:57
    
+1! Beyond this specific question, I think you've displayed a model for great answers -- specific code that does the job + an explanation of why it works. I wish I could keep up voting this kind of answer. –  Jagra Feb 12 '13 at 14:53
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.