Re: Defining a Function with an Indeterminate Number of Arguments
- To: mathgroup at smc.vnet.net
- Subject: [mg81269] Re: Defining a Function with an Indeterminate Number of Arguments
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Tue, 18 Sep 2007 00:38:19 -0400 (EDT)
- References: <fclbai$fh8$1@smc.vnet.net>
Donald DuBois wrote: > 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). > How about this (the example from OptionValue's doc page, adapted to do what your function does): Options[fun] = { opt1 -> 10, opt2 -> 20 } fun[arg___, OptionsPattern[]] := {{arg}, Head/@{arg}, OptionValue[opt1], OptionValue[opt2]} ? > (* 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] You did not use OptionsPattern[] in the usual way here, so it does not know where to take the default options from. Change it to OptionsPattern[fnc2], and it will work. But I still recommend the alternate solution I presented above. Don't use Print[], Module[], ;, and other ugly procedural constructs when you don't need them. -- Szabolcs