Options, OptionsPattern, and OptionsValues
- To: mathgroup at smc.vnet.net
- Subject: [mg118851] Options, OptionsPattern, and OptionsValues
- From: blamm64 <blamm64 at charter.net>
- Date: Fri, 13 May 2011 06:26:36 -0400 (EDT)
Hi, I am developing a package for implementing polynomial linear least squares time domain filter and ran across the subject of this post as an interesting alternative to what I was doing to pass options. There is one exported function, so it gets all the user-supplied options, and it then handles which private functions actually do the work and how they go about by receiving options from the exported function. So I tried what amounts to the following: In[1]:= Options[f]={a->"None",b->"both",c->"either",dog->False}; In[2]:= f[x_,OptionsPattern[]]:=If[OptionValue[dog],g[x],h[x]] In[3]:= g[x_,OptionsPattern[f]]:={3 x,OptionValue[a],OptionValue[b]} In[4]:= h[x_,OptionsPattern[f]]:={4*x/7,OptionValue[a],OptionValue[c]} In[5]:= f[2,c->"left"] Out[5]= {8/7,None,either} In[6]:= f[2,c->"None"]//Trace Out[6]= {{c->None,c->None},f[2,c->None],If[OptionValue[f,{c- >None},dog],g[2],h[2]],{OptionValue[f,{c- >None},dog],False},If[False,g[2],h[2]],h[2],{(4 2)/7,OptionValue[f, {},a],OptionValue[f,{},c]},{{{1/7,1/7},2/7,2/7},(4 2)/7,8/7}, {OptionValue[f,{},a],None},{OptionValue[f,{},c],either}, {8/7,None,either}} My hope was to pass options to the exported function, which used some of those options to determine which worker to call and then passed all those options to the workers, who decide what options they need and what to do with those options. I was trying to implement 'find what varies and encapsulate it'. I came up with this scheme by looking at Documentation and reading what I could find in this forum, but saw nothing in either place (perhaps because it is 'intuitively obvious' to some this cannot be done ... ). If this had worked, it would have scaled with increasing option number beautifully. I ended up using alternative of passing only what the workers needed in the calls to them in the main exported function using OptionValue in the main and using a pattern <opts___> in the workers, but that does not scale well at all with increasing number of options. So I think all I can hope to do is have someone please explain to me the Trace, which I still have a hard time decoding. I got stuck on the very first 'list'. But it is plain to see where the option 'got lost'. What is not plain to me is why. I'm probably missing some very fundamental Mathematica evaluation paradigm. Thanks to any and all who help me out. -Brian L.