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.

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]]}}?

share|improve this question
1  
Length[expr]==0 is 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 for Complex. –  Pickett Nov 15 '13 at 6:20
    
@Anon: Length[{}]==0 yet f@@{}==f[]. The original question seems now just a convoluted way towards Length[#] == 0 && AtomQ[#] &. –  Hector Nov 15 '13 at 10:08
    
It is also true that Length@f[] == 0. :/ I don't think it's possible to create a fake atom. I hope someone proves me wrong. –  Pickett Nov 15 '13 at 10:28
add comment

Your Answer

 
discard

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

Browse other questions tagged or ask your own question.