MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Defining a Function with an Indeterminate Number of Arguments

  • To: mathgroup at smc.vnet.net
  • Subject: [mg81244] Defining a Function with an Indeterminate Number of Arguments
  • From: Donald DuBois <donabc at comcast.net>
  • Date: Mon, 17 Sep 2007 03:37:09 -0400 (EDT)

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


  • Prev by Date: Re: Automated documentation (like javadoc) for packages?
  • Next by Date: Re: LegendreP error (bug?) in Mathematica
  • Previous by thread: Re: Changing Textbook.nb to label equations
  • Next by thread: Re: Defining a Function with an Indeterminate Number of Arguments