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. $\endgroup$Abort
is 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: useThrow
maybe. $\endgroup$Message
and print an informative error message. $\endgroup$