Re: Why use OptionsPattern, OptionsValue ?

*To*: mathgroup at smc.vnet.net*Subject*: [mg102398] Re: Why use OptionsPattern, OptionsValue ?*From*: David Bailey <dave at removedbailey.co.uk>*Date*: Sat, 8 Aug 2009 04:36:45 -0400 (EDT)*References*: <h58rgj$q8r$1@smc.vnet.net>

Ted Ersek wrote: > Prior to Mathematica version 6 a good way to write a function with two > options was the following. > > ----------------------------------------------------------- > Options[foo] = {Opt1 -> val1, Opt2 -> val2}; > > foo[x_, opts___?OptionQ] := Module[{optn1, optn2}, > {optn1, optn2} = {Opt1, Opt2} /. Flatten[{opts, Options[foo]}]; > Blah[x, optn1, optn2] > ] > > ---------------------------------------------------------- > I am pretty sure the program above does the same thing in every version > of Mathematica (since version 3 if not earlier). However, as of > Mathematica 6 we have OptionsPattern, and OptionsValue. It seems the > main utility of OptionsPattern, and OptionsValue are to define functions > such as the one above. > > One clear advantage to the old approach (see my example above) is that > you end up with code that works well across many versions of > Mathematica. What are the advantages to implementing options using > OptionsPattern, and OptionsValue? > > Thanks, > Ted Ersek > > > > One advantage/feature (depending on your point of view) is that the name of an option can be specified without regard to context, and can even be a string. Another, is that using non-existent options generates an error message: In[5]:= Options[foo] = {aaa -> 0}; foo[OptionsPattern[]] := OptionValue[aaa] In[7]:= foo[aaa -> 9] Out[7]= 9 In[8]:= foo["aaa" -> 8] Out[8]= 8 In[9]:= foo[bbb -> 10] During evaluation of In[9]:= OptionValue::nodef: Unknown option bbb for foo. The built-in mechanism also handles options specified with Rule or RuleDelayed without complication. I always use the new mechanism, but I don't write code for use with pre-version 6. David Bailey http://www.dbaileyconsultancy.co.uk