Re: Defining a Function with an Indeterminate Number of Arguments
- To: mathgroup at smc.vnet.net
- Subject: [mg81273] Re: Defining a Function with an Indeterminate Number of Arguments
- From: "David Park" <djmpark at comcast.net>
- Date: Tue, 18 Sep 2007 00:40:23 -0400 (EDT)
- References: <fclbai$fh8$1@smc.vnet.net>
Looking at a simpler example:
Options[DonFunction] = {DonColor -> Black};
SyntaxInformation[
DonFunction] = {"ArgumentsPattern" -> {__, OptionsPattern[]}};
DonFunction[args__, OptionsPattern[]] :=
Module[{color},
color = OptionValue[DonColor];
Style[#, FontColor -> color] & /@ {args}
]
DonFunction[a, b, c]
DonFunction[a, b, c, d, e, DonColor -> Red]
And note specifically that the double blank, __, should be used to indicate
1 or more arguments and not the double dot.
--
David Park
djmpark at comcast.net
http://home.comcast.net/~djmpark/
"Donald DuBois" <donabc at comcast.net> wrote in message
news:fclbai$fh8$1 at smc.vnet.net...
> Hello -
>
> I am trying to define a function with the following two properties :
>
> (A) The function should be able to take an indeterminate number of
> arguments without using the List structure (like the Which or StringJoin
> functions in Mathematica).
>
> (B) The function should have the capability of defining and using options
> in the usual way (i.e. using the Options function outside the package
> definition
> to define the option default values and using OptionValue within the
> function definition to retrieve the options with locally defined option
> values overriding the default values).
>
> As a first attempt, fnc1 below is able to have as
> input an indeterminate number of arguments.
>
> fnc1[args : _ ..] := Module[{},
> values = args;
>
> Print["Argument Values: "];
> Table[Print[i, " ", {values}[[i]], " Head ",
> Head[{values}[[i]]]], {i, Length[{values}]}];
> ]; (* End Module *)
>
> fnc1[b, 3, "strg1"]
>
> Argument Values:
>
> 1 b Head Symbol
>
> 2 3 Head Integer
>
> 3 strg1 Head String
>
>
> However, when I try (in fnc2 below) to define default option values in the
> usual way for this function, I am unable to retrieve them - only the
> locally defined option values (opt1 in the e.g. below) become known to the
> function.
>
>
> (* Define Default Options *)
> Options[fnc2] =
> {
> opt1 -> 10,
> opt2 -> 20
> };
>
> fnc2[args : _ ..] := Module[{},
>
> (* Extract the non-rule arguments from args *)
>
> values = Cases[{args}, Except[_Rule]];
>
> Print["Argument Values: "];
> Table[
> Print[i, " ", values[[i]], " Head ", Head[values[[i]]]], {i,
> Length[values]}];
>
> (* Extract the options from args *)
> localOpts = Cases[{args}, _Rule];
>
> Print["local options list = ", localOpts];
>
> Print["Final Option Values: "];
> Print["opt1 = ",
> localOpts /. OptionsPattern[] :> OptionValue[opt1]];
> Print["opt2 = ",
> localOpts /. OptionsPattern[] :> OptionValue[opt2]];
>
> ] (* End Module *);
>
> fnc2[b, 3, "strg1", opt1 -> 15]
>
> Argument Values:
>
> 1 b Head Symbol
>
> 2 3 Head Integer
>
> 3 strg1 Head String
>
> local options list = {opt1->15}
>
> Final Option Values:
>
> opt1 = 15
>
> opt2 = opt2
>
>
> There is a messy workaround (fnc3 below) but the default option values
> are redefined every time it is used.
>
> fnc3[args : _ ..] := Module[{},
> defaultOpts = {opt1 -> 10, opt2 -> 20};
>
> (* Extract the non-rule arguments from args *)
> values = Cases[{args}, Except[_Rule]];
>
> Print["Argument Values: "];
> Table[
> Print[i, " ", values[[i]], " Head ", Head[values[[i]]]], {i,
> Length[values]}];
>
> (* Extract the local options from args *)
> localOpts = Cases[{args}, _Rule];
> Print["local options list = ", localOpts];
> Print["default options list = ", defaultOpts];
>
> (* Combine localOpts with defaultOpts where localOpts take
> precedence *)
>
> combinedOpts =
> Flatten[Split[Sort[Join[defaultOpts, localOpts]],
> First[#1] === First[#2] &] /. {dd_Rule, ddd_Rule} -> ddd ];
>
> Print["Final Combined Option Values: "];
> Print["opt1 = ",
> combinedOpts /. OptionsPattern[] :> OptionValue[opt1]];
> Print["opt2 = ",
> combinedOpts /. OptionsPattern[] :> OptionValue[opt2]];
>
> ]; (* End Module *)
>
> fnc3[b, 3, "strg1", opt1 -> 15]
>
> Argument Values:
>
> 1 b Head Symbol
>
> 2 3 Head Integer
>
> 3 strg1 Head String
>
> local options list = {opt1->15}
>
> default options list = {opt1->10,opt2->20}
>
> Final Combined Option Values:
>
> opt1 = 15
>
> opt2 = 20
>
> Is there a way to define a function that has the two properties, (A and B
> above) so that it takes an indefinite number of arguments (without the
> List curly brackets or List function) and where options can be defined
> using the Options and OptionValue functions in the usual way?
>
> Thank you in advance,
>
> Don
>