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).
>

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[
>      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

```

• Prev by Date: Re: Defining a Function with an Indeterminate Number of Arguments
• Next by Date: Re: LegendreP error (bug?) in Mathematica
• Previous by thread: Re: Defining a Function with an Indeterminate Number of Arguments
• Next by thread: SWF runs to fast