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. – Heike Jun 19 '12 at 14:33foo[x__Integer] := {x}? And what forbar[x_] := 1; bar[x_, y_, z_] := 2? Should it also considerUpValueslikef[g,g] ^= 0? And woulda[x_, {y_, z_}] := x+y/zcount as taking two or three arguments? – celtschk Jun 19 '12 at 14:39f[x_]:=1,f[x_,y_]:=1,f[x_,OptionsPattern[]]– image_doctor Jun 19 '12 at 14:52p[n_][x_] := (* stuff *)... – J. M.'s missing motivation Jun 19 '12 at 15:03- {1,0}
- {2,0}
- {1+n,n} assuming that OptionsPattern takes up to n optional values
– Jane T. Jun 19 '12 at 15:04foo[x__Integer] := {x}xis aBlankSequenceand thus can be any number of arguments. Then{1,0}would not necessary be correct... – freddieknets Jun 19 '12 at 15:14f[x] /@ {a, b, c, ...}– J. M.'s missing motivation Jun 19 '12 at 15:20fcoexist perhaps the output might be a list:{{1,0,False},{2,0,False},{1,0,True}}where{_,_,_}->{required,optional,options}– image_doctor Jun 19 '12 at 15:30f[a:x_ + y_:4], what should your function return, then? – rcollyer Jun 20 '12 at 01:54