infix("X") returns the atom $X (which prints as "X").
The problem with that is that after X is defined as infix,
that atom is useless and in fact can't be input into
Maxima; "X" means the *string* X, not the *operator* X.
Maxima goes to great lengths to make sure that
operators can be referred to by their string name. For
example, part(1 x 2,0) returns the string &X ("X") even
though internally it is $X.
Infix("X") should thus be returning the *string* &X ("X").