Re: Q: extracting list of arguments of function
- To: mathgroup at smc.vnet.net
- Subject: [mg16610] Re: [mg16468] Q: extracting list of arguments of function
- From: "Wolf, Hartmut" <hwolf at debis.com>
- Date: Fri, 19 Mar 1999 12:53:44 -0500
- Organization: debis Systemhaus
- References: <199903130722.CAA24544@smc.vnet.net.>
- Sender: owner-wri-mathgroup at wolfram.com
Hello Jerzy
Jerzy Niesytto schrieb:
>
> Let's assume that we want to pass function goo as argument
> to another function foo and extract list of arguments
> of the function goo:
> foo[fun_] := Module[{argList}, argList = Table[fun[[i]],{i,1,2}] ]
> foo[goo[x,y]];
>
> This will result in list:
> {x,y}
>
> But if goo was defined before eg:
> goo[s_,t_] = s^2 + t^3;
>
> then we get:
> {x^2,y^3} .....
>
> Can anybody point me in a right direction here?
Jerzy you tried to extract the arguments of a function as a List, I
propose to extract them as the object it *is*, namely a Sequence (i.e.
an argument sequence). To do so, just Delete the Head of g[x,y] :
In[1]:= Delete[g[x,y],{0}]
Out[1]= Sequence[x,y]
But that doesn't work when g ist defined
In[2]:= g[x_,y_]:=x^2-y^2
In[3]:= Delete[g[r,s],{0}]
Out[3]= Sequence[r^2, -s^2]
This is so because g[r,s] already gets evaluated within Delete. To
obviate that we enclose the function g with Hold, then we have to first
delete the Head g within Hold, and then the remaining Head Hold:
In[4]:= Delete[Hold[g[x,y]],{{1,0},{0}}]
Out[4]= Sequence[x,y]
If you insist in having that as a List, just guide this object (argument
sequence) to List
In[5]:= List[%]
Out[5]= {x,y}
However, if the arguments to the function g already got a value, then...
In[25]:= x=2; y=4; z=x+y;
In[26]:= Delete[Hold[g[x,y,z]],{{1,0},{0}}]
Out[26]= Sequence[2,4,6]
...you'll get the calling sequence with the actual calling parameters.
This may be exactly what you want. Otherwise keep the outer Hold
In[27]:= Delete[Hold[g[x,y,z]],{1,0}]
Out[27]= Hold[x,y,z]
But whenever you touch at the arguments you'll get their values back
In[28]:= List@@%
Out[28]= {2,4,6}
You still have a different option to first wrap the arguments with Hold:
In[49]:= Map[Hold,Hold[g[x,y,z]], {2}]
Out[49]= Hold[g[Hold[x],Hold[y],Hold[z]]]
In[50]:= Delete[%,{{1,0},{0}}]
Out[50]= Sequence[Hold[x],Hold[y],Hold[z]]
But effectively Out[27] and Out[49]+Out[50] just tells you that g was
called with 3 Parameters, and nothing more! And if you called g by
values, you get
In[54]:= Delete[Map[Hold,Hold[g[x,3,z+1]], {2}],{{1,0},{0}}]
Out[54]= Sequence[Hold[x],Hold[3],Hold[z+1]]
Which is fine if your are writing a debugger. I don't know your real
problem, but my recommendation is In[26].
Of course all this also works when calling pure functions
In[30]:= Delete[Hold[(#1 E^#2+Sin[#3]&)[x,y,z]],{{1,0},{0}}]
Out[30]= Sequence[2,4,6]
---Hartmut
__________________________________________________
Hartmut Wolf, debis Systemhaus, Darmstadt, Germany
- References:
- Q: extracting list of arguments of function
- From: Jerzy Niesytto <woland99@earthlink.net>
- Q: extracting list of arguments of function