Mapping on leaves

Say I have some nested structure, such as {a,{{b,c},d,{e,{f,g}}}}, and I want to apply a function $q$ to each of the leaves; that is, I want the output to be {q[a],{{q[b],q[c]},q[d],{q[e],{q[f],q[g]}}}}. There must be a primitive to do this, but I can't find it. I initially thought that Map with a third argument of Infinity would do it, but that does something different (in addition to applying q at the leaves, it also applies it to each higher-level list element).

• Attributes[q] = Listable or you can Map at {-1} unless a,b,c... are non atomic,
– Kuba
Nov 16, 2015 at 14:53
• @Kuba I guess I should have read that page more carefully. Thanks. Nov 16, 2015 at 14:56
• @Kuba I should note that the Attributes[q] = Listable version won't work unless all containers for leaves are Lists. Nov 16, 2015 at 15:53

A little "secret" of level specifications is that they can be negative. -1 refers to the atomic leaves, -2 refers to all Depth 2 subexpressions, generally -k refers to all depth k subexpressions. Thus the behaviour of negative levels is somewhat different from that of positive ones.