cleaner way to do Options (named arguments)
- To: mathgroup at smc.vnet.net
- Subject: [mg33448] cleaner way to do Options (named arguments)
- From: Daniel Reeves <dreeves at flip.eecs.umich.edu>
- Date: Thu, 21 Mar 2002 09:27:47 -0500 (EST)
- Organization: University of Michigan Engineering
- Sender: owner-wri-mathgroup at wolfram.com
I found that creating a function with Options (named arguments) was clunky so I wrote the following function: SetAttributes[withOptions, HoldAll]; withOptions[defaults_, overrides_, body_] := ReleaseHold[Hold[body]/.Evaluate[overrides]/.Evaluate[defaults]] With that defined, creating a function with Options is a little cleaner. For example: Options[f] = {a -> 1, b -> 2}; f[x_, opts___] := withOptions[Options[f], {opts}, (* body of f here... *) {x,a,b} ] One problem with that is that 2 functions with the same options can't call each other. So maybe the following version is better: SetAttributes[withOptions, HoldAll]; withOptions[defaults_, overrides_, body_]:= ReleaseHold[ Hold[body] /. (opt[#1]->#2&) @@@ Join[Evaluate[overrides],Evaluate[defaults]]] and now the example would be defined as like so: Options[f]= {a -> 1, b -> 2}; f[x_, opts___] := withOptions[Options[f], {opts}, (* body of f here... *) {x, opt@a, opt@b} (* can now call another func with the same option: g[a->opt@a] *) ] Can anyone see problems with this, or have a better way to do it? -- -- -- -- -- -- -- -- -- -- -- -- Daniel Reeves http://ai.eecs.umich.edu/people/dreeves/ "In science one tries to tell people, in such a way as to be understood by everyone, something that no one ever knew before. In poetry, it's the exact opposite." -- Paul Dirac (1902-1984)