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 >