I have a newbie question: is it possible to write a function that counts the arguments (total and optionals) of a given function? Possibly it should be able to work with built-in and custom functions as well.
For example, if I define
f1[x_Integer] := x + 1;
f2[x_Integer, y_Integer: 1] := x + y;
g[x_Real, y_] := x - y;
I would like to have
countArgs[f1]
{1,0}
countArgs[f2]
{2,1}
countArgs[g]
{2,0}
and also, for example,
countArgs[Sin]
{1,0}
thank you.
@celtschk
Well, I didn't even know the use of UpValues, but basically what I am asking is the number of inputs the function needs, I don't care what the function does with those inputs. In your examples I would say
- {Infinity,0} for foo? It's more a question than an answer, sorry, but I had not thought aboute these unusual cases.
- this is nasty, I didn't think of a case like that either, I would say {3,{2}}, the {2} meaning exactly 2, to avoid bar[1,2], which is not legal.
- {2,0} but just because you wrote f[g,g], so it's practically a guess, I don't know what are UpValues and if they go against the spirit of my question by messing with the function. I hope I was clear.
- the last one I would say {3,0} as they were flattened.
Thank you, I start seeing that my question is not so obvious because there are too many complicated definitions for functions to take into account.
For now I understood that is possible with built-in functions with
SyntaxInformation[f]
(thank you Heike) but that mybe is a little too much asking for a general custom function.
SyntaxInformation
. For exampleSyntaxInformation[Mod]
returns{"ArgumentsPattern" -> {_, _, _.}}
indicating 3 arguments of which the last one is optional. $\endgroup$foo[x__Integer] := {x}
? And what forbar[x_] := 1; bar[x_, y_, z_] := 2
? Should it also considerUpValues
likef[g,g] ^= 0
? And woulda[x_, {y_, z_}] := x+y/z
count as taking two or three arguments? $\endgroup$f[x_]:=1,f[x_,y_]:=1,f[x_,OptionsPattern[]]
$\endgroup$p[n_][x_] := (* stuff *)
... $\endgroup$