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 can't figure out what's wrong with this piece of code. I'm trying to define a function that counts the occurrences of x, y and l or lc in expressions like x[x[y[l]], where x will add 1 to an "eigenvalue", y will subtract 1 and likewise for l and lc. Then for example I would get H[x[x[y[l]]] = 2. Now I'm stuck at the first phase with the function defined below:

H[z_] := Module[{list1 = Join[Level[z, Infinity], {z}], lam = 0},
  Which[list1[[1]] == l, lam = lam + 1, 
        list1[[1]] == lc, lam = lam - 1
  ];
  lam
]

This should give H[l] = 1 and H[lc] = -1, but instead I get just the initial value lam = 0 for the "lc" case... When I discard the last line and use instead

H[z_] := Module[{list1 = Join[Level[z, Infinity], {z}], lam = 0},
  Which[list1[[1]] == l, lam = lam + 1, 
        list1[[1]] == lc, lam = lam - 1
  ]
]

I get

Which[lc == l, lam$538474 = lam$538474 + 1, 
      list1$538474[[1]] == lc, lam$538474 = lam$538474 - 1
]

Clearly something's wrong with the list1$538474[[1]] above. What am I missing?

share|improve this question
    
I quit and restarted the kernel and nothing!! This is beginning to seem really strange... –  H. Arponen Jan 16 '13 at 19:40
    
What do you mean by "nothing"? No change? No output? –  Sjoerd C. de Vries Jan 16 '13 at 19:41
    
Still gives H[lc]=0... –  H. Arponen Jan 16 '13 at 19:41
add comment

1 Answer 1

up vote 5 down vote accepted

Use SameQ (===) instead of Equal (==). Equal of two symbols will return unevaluated (so neither True nor False) causing Which to return unevaluated:

If any of the $test_i$ evaluated by Which give neither True nor False, then a Which object containing these remaining elements is returned unevaluated.

Which[foo == foo, 1, foo == bar, 2]

(* ==> 1 *)

Which[foo == bar, 1, foo == foo, 2]

(* ==> Which[foo == bar, 1, foo == foo, 2] *)
share|improve this answer
    
5 secs too late... –  Sjoerd C. de Vries Jan 16 '13 at 19:54
    
He could also use TrueQ[foo==bar] –  Mike Honeychurch Jan 16 '13 at 21:15
    
@MikeHoneychurch True, although that requires more typing. :-) –  Brett Champion Jan 16 '13 at 21:30
    
sure does. exhausting :) . Was just wanting to cover all the bases in any case. –  Mike Honeychurch Jan 16 '13 at 21:31
    
That works great, thanks Brett!! :) –  H. Arponen Jan 17 '13 at 7:26
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.