# What's reliable way of finding declared but undefined functions/symbols in several interrelated packages?

I have many packages some of which use some of others. I have many symbols defined in them. Is there a reliable way of finding declared/exported but undefined functions/symbols in several interrelated packages?

• You mean, to filter all the names in a given context leaving only those without any values defined on them? – Rojo Oct 26 '12 at 15:42
• My PackageManipulations  package, available here, has the functionality to track escaping symbols. – Leonid Shifrin Oct 27 '12 at 21:13

So here is an answer to Rojo's interpretation (which I agree with) of that question:

Select[Names["Global*"], (First[ToBoxes@Definition[#]] === "Null") &]


Replace "Global" with context of interest.

Maybe doesn't look neat but works well so far. It is based on an assumption that Definition of a symbol without any values will return Interpretation[Null,Definition[...]]

Another method not based on boxes:

With[{
info = {Attributes, DefaultValues, DownValues, FormatValues,
Messages, OwnValues, SubValues, UpValues, NValues}
},
Select[
Names["Global*"],
{} === Flatten @ Through[
info[ToExpression[#, StandardForm, Unevaluated]]
] &
]
]


or something less documented

Select[
Names["Global*"],
{} === ToExpression[ #, StandardForm,
Echo @* Flatten @* Values @* Values @* First @*
LanguageExtendedFullDefinition
] &
]


Both ideas stolen from Triggering actions when a variable is set

• Should messages count as definitions? i.e. does x::foo = "123" make x a defined Symbol? – Mr.Wizard Jul 28 '16 at 7:38
• @Mr.Wizard good question, probably not for a sake of consistency but I would count it from a practical point of view. – Kuba Jul 28 '16 at 7:52
• @Mr.Wizard answer upgraded :) – Kuba Jul 28 '16 at 19:47
• Noted. You already had my vote however. :-) – Mr.Wizard Jul 29 '16 at 5:36