Usually h @@@ {f[1, 2], f[3, 4]} === {h[1, 2], h[3, 4]}
but this is not the case when f
is Complex
: h @@@ {1 + 2I, 3 + 4I } === {1 + 2 I, 3 + 4 I}
Since Complex
is an atomic and as documentation for Apply
states: Applying to atomic objects that do not have subparts effectively does nothing
Using Block
to replace Complex
with complex
gives result as expected for non-atomic case:
Block[{Complex = complex},
List @@@ {Complex[1, 2], Complex[3, 4]}
]
(* {{1, 2}, {3, 4}} *)
But then how come replacing Complex
with List
while not Apply
-ing does not give the same result?
Block[{Complex = List},
{Complex[1, 2], Complex[3, 4]}
]
(* {Complex[1, 2], Complex[3, 4]} *)
As it would have for a non-atomic head:
Block[{f = List},
{f[1, 2], f[3, 4]}
]
(* {{1, 2}, {3, 4}} *)
TracePrint[Block[{Complex = List}, {Complex[1, 2], Complex[3, 4]}]]
, the replacement happens. Quite odd, this evaluation... $\endgroup$With[{Complex = List}, {Complex[1, 2], Complex[3, 4]}]
works, but still does not explain the behavior.Block[{Complex = complex}, {Complex[1, 2], Complex[3, 4]}]
does not work either, soApply
ing seems to be the key $\endgroup$Block[{Complex}, Complex := List; {Complex[1, 2], Complex[3, 4]}]
, and after that, the original example works too. Looks like some changes are not propagated properly. $\endgroup$Complex
exists only by implication, as in a packed array. $\endgroup$Complex[1, 2]
is not equivalent to1 + 2I
.Block[{Complex = f}, List @@@ {Complex[1, 2], 3 + 4 I}]
gives{{1, 2}, 3 + 4I}
I thought that was just a syntactic difference $\endgroup$