For example, suppose that foo is defined like this.
foo[x_Integer, y_Integer] := x + y;
Then, any expression with head foo that does not match the pattern given above will remain "unevaluated". E.g., foo[3] "evaluates" to foo[3].
Although I recognize that there are situations where one may want precisely this behavior, in most of my programming I don't. Quite the contrary: I want expressions like foo[3] to be treated as malformed, IOW, as errors, and therefore to result in a loud, unequivocal failure whenever they are evaluated.
Hence, I find myself writing a lot of code of the form
foo[x_Integer, y_Integer] := x + y;
foo[___] := Abort[];
(Actually, I use a slightly embellished version of Abort[].)
But including a line like
foo[___] := Abort[];
for every function one defines adds up to a lot of hard-to-maintain clutter-code.
Does Mathematica have some other way to achieve the same thing with less clutter?
foo[___] := ...is pretty much the standard idiom. I have never found that it produced any code maintenance problems. – m_goldberg Dec 10 '16 at 17:41Abortis a rather drastic measure, and IMO not really the right solution for a reusable functions ... Unfortunately there's no one consistent way to deal with failures in Mathematica. Typical ways are: keep unevaluated and issue a message. Return$Failed, with or without a message. ReturnFailure[...]. In functions internal to your package: useThrowmaybe. – Szabolcs Dec 10 '16 at 17:42Messageand print an informative error message. – m_goldberg Dec 10 '16 at 17:43Message) aside from coming out unevaluated; for instance, if you have a definition likef[n_Integer] := n!and you try to evaluatef[0.5], the expression is returned as is. – J. M.'s missing motivation Dec 11 '16 at 10:40f[0.5]is returned as is. My whole point is that, in my coding at least (and apparently, per your earlier comment, in a lot of the Mathematica standard library) such way of handlingf[0.5]is not desirable, thus necessitating the explicit catch-all case. – kjo Dec 11 '16 at 10:45