This is a follow up to this question.
So far, I named "explicit" heads to those that appear explicitly in the expression. For example, f[x] has an explicit head. I called "implicit" heads to those that are returned by Head but do not appear in the expression. For example, 5 has Integer as implicit head.
In the comments of the original question, rcollyer pointed out that the head of Complex[1,2] is explicit but f@@Complex[1,2] is not "decapitated" because AtomQ@Complex[1, 2] returns True. Then, I came up with the following code:
myAtom /: AtomQ[myAtom[__]] := True
f @@ myAtom[1, 2, 3]
(*f[1,2,3]*)
How does Apply know when the head can be replaced?
According to the documentation of Apply:
Applying to atomic objects that do not have subparts effectively does nothing
Thus, it seems that checking with AtomQ is not enough. One should also check for the existence of parts. For example, Complex[1,2][[1]] returns an error but myAtom[1, 2, 3][[1]] does not. Incidentally, TreeForm[Complex[1, 2]] shows "parts".
Hence the question: Is there a function that makes both checks at once?
Follow up:
Is there any way to make a head non-decapitable?
Is there a statement similar to myAtom /: AtomQ[myAtom[__]] := True such that
Map[f, {1, {2, myAtom[3]}}, {-1}]
will return {f[1], {f[2], f[myAtom[3]]}}?
Length[expr]==0is the test you're looking for, I think, but someone else would have to confirm that it always works. I don't know that much about this. I guessed it because it checks the criteria that you quoted and works forComplex. – C. E. Nov 15 '13 at 06:20Length[{}]==0yetf@@{}==f[]. The original question seems now just a convoluted way towardsLength[#] == 0 && AtomQ[#] &. – Hector Nov 15 '13 at 10:08Length@f[] == 0. :/ I don't think it's possible to create a fake atom. I hope someone proves me wrong. – C. E. Nov 15 '13 at 10:28