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